简单算法模拟

进制转化

熊熊学长从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。熊熊学长非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。

# include<stdio.h>
int f(int x,int n)
{   int a;
	while(x)
	{
		a+=x%n;
		x/=n;
	}
	return a;
}

int main()
{
	int  x;
	while(scanf("%d",&x)!=EOF)
	 { if(x==0)
	    break; 
	   if(f(x,10)==f(x,12)&&f(x,10)==f(x,16))
	   printf("%d is a Sky Number.\n",x);
	   else
	   printf("%d is not a Sky Number.\n",x);
	 }
	return 0;
}

模拟

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。

你的任务就编写一个程序,判断给定的两个数是否是亲和数

# include<stdio.h>
int s;
int f(int n)
{ 
	for(int i=1;i<n;i++)
	 {
	 	if(n%i==0)
	 	 s+=i;
	 }
	 return s;
}
int main()
{   int a;
	int n,m; 
	scanf("%d%d",&n,&m);
    if(f(m)==n&&f(n)==m)
	printf("YES");
	else
	printf("NO");
	return 0;
}

巴什博弈论

很简单,它是这样定义的:
1、 本游戏是一个二人游戏;
2、 有一堆石子一共有n个;
3、 两人轮流进行;
4、 每走一步可以取走1…m个石子;
5、 最先取光石子的一方为胜;

如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

# include<Stdio.h>

```c
int main()
{
	int m,n,x;
	scanf("%d",&x);
	while(x--)
	{  scanf("%d%d",&m,&n);
		if(m%(n+1)!=0)
		printf("first\n");
		else
		printf("second\n");
	}
	return 0;
}

原理论巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

暴力循环

熊熊是一名csgo玩家,在沙二驰骋多年的他,显然已经对这个地方了如指掌。他恐怖的定位和风骚的身法以及高超的战术让他的队友后悔来到这个地方。尤其是他的大狙,当他扛着笨重的awp走到中门时,每一声枪响都会有人应声倒地。但是熊熊有个奇怪的癖好,他每一次只杀奇数个数的人,一杀他嫌太少,九杀又太多,所以他每一局他只会打出三杀,五杀或七杀。现在你在他旁边看他打游戏,你看到他杀了n个人,你现在想知道他分别打出了多少个三杀,五杀或七杀。

# include<stdio.h>
int main()
{
	int n=0,m=0,i=0,j=0,k=0;
	scanf("%d",&m);
	while(m--)
	{  scanf("%d",&n);
	  int flag=0;
		for( i=0;i<n;i++)
		 {
		 for(j=0;j<n;j++)
		  {
		    for( k=0;k<n;k++)
		    {
		    	if(3*i+5*j+7*k==n)
		    	{
		    		flag=1;
		    		break;
		    	}
				  } 
				  if(flag==1)
				  break;
		        	} if(flag==1)
				  break;  
				    }
			if(flag==0)
			printf("%d\n",-1);
			else
			printf("%d %d %d\n",i,j,k);
			
		}
			return 0;
}
	

暴力枚举,三重循环嵌套,简单模拟即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值