B积木游戏

小明和小华利用积木玩了一场游戏。
小明拿出了n块积木(0<n<10(1000002次方)),现在他和小华轮流拿走一些积木,每人每次拿走的块数是2的次方(例如1,2,4,8,16……)谁能拿走最后一个积木,谁就获胜。
现在小华让小明先拿。如果他们都足够聪明,那么谁能取得胜利呢?由于这个游戏采用三局两胜制度,小明想知道这三局每局他能否获胜,如果必胜,第一步最少拿走的积木数量是多少?
输入格式
三行每行一个数n。
输出格式
对于每局,如果小华必胜则输出一行“Hua will win.";否则第一行输出”Ming will win.",第二行输出他第一次拿的最小数量。
数据范围
对于10%的数据n<=10
对于30%的数据n<=100000
对于100%的数据,0<n<10(1000002次方)

样例输入
8
4
2
样例输出
Ming will win.
2
Ming will win.
1
Ming will win.
2

这题就是找规律,如果n%3==0,那么hua必胜,否则ming必胜
但是这里的数据很大,所以用高精来求余数。

#include<bits/stdc++.h>
using namespace std;
char a1[1000010];
int a[1000010], lena, i, res[1000010], s;//res[110]存储每一位商 s表示余数 
int main(){
	long long n;
	for(int j=1; j<=3; j++){
		gets(a1);
		lena=strlen(a1);
		//高精求余数 
		for(i=0; i<lena; i++)//将a1字符串数组按照顺序存储在a[i]整形数组中 
			a[i]=a1[i]-'0';
		s=a[0];//将余数初始化 
		for(i=1; i<lena; i++)//for循环输出找到每一位商,和最后的余数 
		{
			int aa=s*10+a[i];//aa表示除数 
			res[i]=aa/3;//取得商 
			s=aa%3;//取得余数 
		}
		s %= 3;
		//判断余数 
		if(s == 0){
			printf("Hua will win.\n");
		}else if(s == 1 || s == 2){
			printf("Ming will win.\n");
			printf("%d\n",s);
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章