Openjudge-计算概论(A)-取石子游戏
描述:
有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢.
比如初始的时候两堆石子的数目是25和7
25 7 | --> | 11 7 | --> | 4 7 | --> | 4 3 | --> | 1 3 | --> | 1 0 |
选手1取 | 选手2取 | 选手1取 | 选手2取 | 选手1取 |
最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。
给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。
输入输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。
输入以两个0表示结束。输出如果先手胜,输出"win",否则输出"lose"
样例输入
34 12 15 24 0 0
样例输出
win lose
提示:假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法.
[a/b]表示a除以b取整后的值.
思路:这题虽然是归类在函数与递归里面,但其实可以不用递归,递归可能会超时,具体怎么做提示里面已经给的很清楚了,这里就不用多解释了。
代码如下:
1 #include<stdio.h> 2 int main() 3 { 4 int a,b; 5 int t,f,c; 6 scanf("%d%d",&a,&b); 7 while(a!=0&&b!=0) 8 { 9 if(a<b)//如果第一堆比第二堆少,交换,保证是先取多的那堆 10 { 11 t=a;a=b;b=t; 12 } 13 f=1;//1表示选手赢,-1表示选手1输。 14 while((c=a/b)==1&&(a%b!=0)) 15 { 16 t=a%b; 17 a=b; 18 b=t; 19 f=-f; 20 } 21 if(f==1) printf("win\n"); 22 else printf("lose\n"); 23 scanf("%d%d",&a,&b); 24 } 25 return 0; 26 }
我不怕千万人阻挡,只怕自己投降…