两个人玩一个数字游戏,给定两个正整数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第一种情况:下一步乙获得(6,4) 然后甲获得(4,2) ,甲获胜(事实上,当甲获得2和4时,他有两种选择,4-(2*2)或4-2,但是题意说明,甲乙足够聪明);第二种情况:以下分别为乙(10,6),甲(6,4),乙(4,2) // 乙胜利第三种情况(乙获得选择权):乙(16,6),甲(6,4),乙(4,2)或乙(16,6),甲(10,6),乙(6,4),甲(4,2)
通过以上举例,大致可以明白,当谁首先获得减法选择权时,他只要控制他的对手随后无法获得选择权,那么他就可以获胜,至于如何去控制对手无法获得选择权,就必须要留给对手两个数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; //假设下一位选手赢
}
}
}