题目:两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍,要保证结果非负,首先得到0的人获胜。

两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍,要保证结果非负,首先得到0的人获胜。例如:30 8经过一步操作可以变为22 8 或者14 8 或者 6 8。两个人都足够聪明。
 输入格式: 多组数据,每组数据占一行是两个空格分隔的正整数(在32位整数范围内)
 输出格式: 每组数据一行,输出是第一个人赢,还是第二个人赢。
思路:
设刚好有甲或乙获得两个数字A和B且A%B==0,则此时获胜的就是获得这两个数字的人;
通过举例,如A=50,B=28;
则有A、B的变化过程如下:
(甲)50   28  //甲此时没有选择权,只能用50去减28
(乙)28   22 //乙同样没有选择权
(甲)22   6   // 甲首次获得选择权,即可以选择用22去减6的整数倍,这时可获得下一个数为4,10 16   
第一种情况:下一步乙获得(64) 然后甲获得(42) ,甲获胜(事实上,当甲获得2和4时,他有两种选择,4-(2*2)或4-2,但是题意说明,甲乙足够聪明);
第二种情况:以下分别为乙(10,6),甲(64),乙(42)  // 乙胜利
第三种情况(乙获得选择权):乙(16,6),甲(64),乙(42)或乙(16,6),甲(10,6),乙(64),甲(42

通过以上举例,大致可以明白,当谁首先获得减法选择权时,他只要控制他的对手随后无法获得选择权,那么他就可以获胜,至于如何去控制对手无法获得选择权,就必须要留给对手两个数A和B使B<A且A<2B,题目要求是两人足够聪明,这里使用辗转相除法就可以了。

JAVA代码:

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int a = sc.nextInt();
            int b = sc.nextInt();
            System.out.println(theMethod(a,b));
        }
    }
    public static int theMethod(int a, int b){
        boolean xWin = true;        //假设第一位选手赢
        int temp;
        while(true){
            if(a<b){           //对A B进行排序 
                a=a+b;
                b=a-b;
                a=a-b;
            }
            if(a%b==0||a>>1>b)         //当A能整除B或A大于B的两倍时,获得这两个数字的选手赢
                return xWin?1:2;
            temp = a%b;
            a = b;
            b = temp;
            xWin = !xWin;  //假设下一位选手赢
        }
    }
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值