POJ 2348 Euclid's Game

题目大意:

题目链接

注释代码:

/*
 * 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值