题意:有两个人玩游戏,游戏内容如下:有两个自然数,第一个人从较大的数中减去较小数的正整数倍,结果是非负数。两人交替进行游戏,谁先把较大的数变为0,则胜利,游戏结束。
解题思路:以m>= n为例(m < n的情况与前面相同),当m=n时先手是必胜的;当m<n时,(m+n,n)肯定能到(m,n),并且这两种状态可肯定有一种是必败,有着一种是必胜,那么(m+kn,n)当k>=2时,肯定能够到达上两种情况的任意一种~~~,则为必胜。
代码如下~
#include <iostream>
using namespace std;
int check(int m,int n)
{
if(n == 0)
return 0 ;
if(m / n >= 2)
return 1 ;
if(check(n , m % n))
return 0 ;
return 1 ;
}
int main()
{
int a , b ;
while(cin >> a >> b)
{
if(a == 0 && b == 0)
break;
if(a%b==0||b%a==0)
cout << "Stan wins" << endl;
else
{
if(a<b)
{
int t = a ;
a = b ;
b = t ;
}
if(check(a , b))
cout << "Stan wins" << endl;
else
cout << "Ollie wins" << endl;
}
}
return 0;
}