第44期-抢数游戏
1 问题描述
有一个抢数游戏,其规则是两人轮流报数,每次可以报m个数,但不许不报也不许多报,第二个人接着往下报,
然后第一个人接着往下报,以此类推,那么第一个人第一次应该报x才可能稳抢到n.
要求:输入m,n,输出第一次应该报x
比如:输入:4 56
输出:第一次应该报1
2 解题思路
- 第一步: 首先分析赢的条件,假设每次可以报4个数,要想抢到56,则自己上次报的数以满足以下条件:①、与56的距离大于四,②、不管对手报的是几,自己都能报到56。而对手报的最小数字是一,所以自己上次报的数必须与56的距离为5
- 第二步: 将4换成m,那么自己只要保证每次与对手报的数和为m+1便可胜利
- 第三步: 由于自己先报,又要保证之后每次与对手报的数和为m+1,那么只需要报的数与n的距离为m+1的倍数即可
- 第四步: 既然如此,那么若数n本身就是m+1的倍数,自己就一定会输
- 第五步: 经过以上分析,可以开始写代码了!
3 解题方法
def a(m, n): if n % (m + 1) == 0: print('在对手不失误的情况下,您输定了') else: a = n % (m + 1) print(f'第一次应该报{a}') m, n = map(int, input('请输入单次最大报数以及最终胜利数,中间用空格隔开').split()) a(m, n)
第1行: 定义函数a,其内自变量m,n,m表示最大报数,n表示最终数
第2行: 判断最终数是否是最大报数加一的倍数
第3行: 是,则输出自己输定了
第4-5行: 不是倍数的情况下,求n除以m+1的余数
第6行: 输出该余数就是自己要报的数
第8行: 使用map(int, input().split())输入m、n并提示用户用空格隔开
第9行: 引用函数a()
代码运行结果为: