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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章