Problem Description
Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then Ollie, the second player, does the same with the two resulting numbers, then Stan, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with (25,7):
25 7
11 7
4 7
4 3
1 3
1 0
an Stan wins.
Input
The input consists of a number of lines. Each line contains two positive integers giving the starting two numbers of the game. Stan always starts.
Output
For each line of input, output one line saying either Stan wins or Ollie wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.
Sample Input
34 12
15 24
0 0
Sample Output
Stan wins
Ollie wins
来自 <http://acm.hdu.edu.cn/showproblem.php?pid=1525>
1: 这道题的思路就是找到必胜点,然后判断这个必胜点是先手拿到还是后手拿到。
2:这道题的必胜点有两种情况:
(1) 就是m>=2*n;(因为编写了一个maxchange函数,所以m一直大于n,便于操作)
(2) 就是相减过程中 m n中有一个变成了 1;
所以接下来就是用代码实现这个思路:
#include<stdio.h>
#include<stdlib.h>
void maxchange(int *a,int *b){
int t;
if(*a<*b){
t=*a;
*a=*b;
*b=t;
}
}
int main (){
int m,n,sum;
while(~scanf("%d%d",&m,&n)&&(m||n)){
maxchange(&m,&n);
sum=0;
if(!(m-n)){
printf("Stan wins\n");//这种写法有一个特殊点必须单独考虑就是m和n相等的情况
continue;
}
while(m/n<2&&(m!=1)&&(n!=1)){//找必胜点,并判断是先手玩家还是后手玩家走到这点。
m-=n;
maxchange(&m,&n);
sum++;
}
if(sum%2==0)
printf("Stan wins\n");
else
printf("Ollie wins\n");
}
return 0;
}