题目大意:
注释代码:
/*
* Problem ID : POJ 2348 Euclid's Game
* Author : Lirx.t.Una
* Language : C
* Run Time : 0 ms
* Run Memory : 160 KB
*/
#include <stdio.h>
int
main() {
int a, b, c;
int player;//表示当前是哪个选手的局面
while ( scanf("%d%d", &a, &b), a ) {
player = 1;//1表示Stan,0表示Ollie,Stan先出手
while (1) {
if ( a > b ) {//一定要将a、b置换成a < b
c = a;
a = b;
b = c;
}
//!( b % a )的局面表示当前选手直接胜利
//b - a > a的局面也表示当前选手直接胜利
//因为对于b - a < a的情况如何处理是无法选择的,只能做出(b - a)、a的局面给对手
//因此b - a < a的局面的胜负情况是固定的
//而b - a > a的情况怎么处理是可以自由选择的,
//假设做出策略(b-an)、a,如果另n = x,且b - ax < a,则b - ax < a的局面就是胜负确定的了
//如果b - ax < a的局面是胜的,则可以另n = x - 1,然后对手只能留给你(b - ax)、a的必胜的局面
//如果b - ax < a的局面是败的,则令n = x,把b - ax < a的败的局面留给对手
//因此在这种局面下不管怎么样都是可以胜的
if ( !( b % a ) || b - a > a ) break;
//对于无法选择的局面b - a < a只能照样做出操作将(b - a)、a的局面留给对手
b -= a;
player = !player;//换对手上
}
if ( player ) puts("Stan wins");
else puts("Ollie wins");
}
return 0;
}
无注释代码:
#include <stdio.h>
int
main() {
int a, b, c;
int player;
while ( scanf("%d%d", &a, &b), a ) {
player = 1;
while (1) {
if ( a > b ) {
c = a;
a = b;
b = c;
}
if ( !( b % a ) || b - a > a ) break;
b -= a;
player = !player;
}
if ( player ) puts("Stan wins");
else puts("Ollie wins");
}
return 0;
}