http://acm.hdu.edu.cn/showproblem.php?pid=1525点击打开链接
1、先简单说一下这个题目的意思:
让求的是用大的数减去小的数,能够使得其中的一个数变成0的人为胜者。
2.其实我觉得就是一个找规律的题目首先我想到的是,(假设a>=b),当a%b==0显而易见先手赢了,当a/b>=2时,这个时候下手也是必胜态,所以唯一需要考虑的就是a/b==1的情况,我的思路是,不断的让较大的数减去较小数的整数倍的数,一直进行下去,当到达前面两种状态的时候,只需要判断进行了几次,就可以判断出到底谁赢了;
下面上代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std ;
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)&&a!=0&&b!=0){
if(b>a) swap(a,b);
int num=0;
while(1){
if(a%b==0||a/b>=2||(a==0)&&(b==0)) break;//S
a%=b;
num++;
if(b>a) swap(a,b);
}
if(num%2==0) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}
还有一个用递归方法做的,其实差不多:
#include <iostream.h>
bool Euclid_game(int num_a,int num_b)//求得两个数胜负状态,返回true,为胜;返回
//false为负
{
if(num_a/num_b<2)
return !(Euclid_game(num_b,num_a-num_b));
else return true;
}
int main()
{
int n,m;
cout<<"two numbers:"<<endl;
cin>>n>>m;//先后输入两个数字
if(Euclid_game(n,m))//若A先出,B后出,则直接将输入的两个数通过传递参数
//返回A的胜负状态,如果为true则输出胜方为A,否则输出胜方为B
cout<<"A"<<endl;
else cout<<"B"<<endl;
return 0;
}