编程挑战-高校俱乐部-数字游戏

题目详情

两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍,要保证结果非负,首先得到0的人获胜。例如:30 8经过一步操作可以变为22 8 或者14 8 或者 6 8。两个人都足够聪明。

输入格式:

多组数据,每组数据占一行是两个空格分隔的正整数(在32位整书范围内)

输出格式:

每组数据一行,输出是第一个人赢,还是第二个人赢。

答题说明

输入样例

3 5

4 5

输出样例:

1

2


解题思路:

对于任意给定的两个数a,b,不防假设a>b。

两个人轮流从一个数中减去另外一个数的正数倍,要保证结果非负这句话,可以知道,当a远大于b时,我们可以选择减去b或2*b或3*b等。

那选择的依据是什么呢?


现在我用4个int数组来进行保存。a[70],b[70],c[70],d[70].

其中a[i]存储除数,b[i]存储被除数,c[i]存储a[i]/b[i]的余数,d[i]存储a[i]/b[i]的商,直到c[i]为0时结束


比如当a=8,b=5时

a     b     c       d 

8     5     3       1

5     3     2       1

3     2     1       1

2     1     0       1



通过以下两个例子来得出第一个人想要赢是如何取数的

case 1).a=10  b=3

a      b      c      d

10    3      1      3

3      1      0      3

此时第一个人为了要保证赢,他必须用a-2*b.此后a=4,b=3,第二个人只能做a-b,使得a=3,b=1,第一个人赢。


case 2).a=8  b=5

a     b     c       d 

8     5     3       1

5     3     2       1

3     2     1       1

2     1     0       1

在这种情况下,第一个人与第二个人他们在每次取数下都只有一种选择,他们无法因为自己足够聪明而自主掌握赢的权利


通过这两种情况,也就可以得出,第一个人与第二个人轮流取数,当谁先遇到d[i] != 1时,他就可以将赢的机会一直把握在手中。

而如果d[i]始终为1,那就只能看缘分了....


以上是分析思路 ,解题可以像我用数组不较麻烦点,也可以用递归...全凭个人喜好。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值