文章目录
1.简介
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
2.思路
1.一共n个人,编号为(0~(n-1)),设最后的胜利者为本次编号y的人
2.第一次报完数后剩下n-1个人,我们把编号重新排列为(0~(n-2)),设最后的胜利者为本次编号为x的人
3.我们可以知道,1中的胜利者y和2中的胜利者x是同一个人
4.由3可以得到, y =( x + m ) % n
5.由以上可以得到递推公式
f(1) = 0
f(i) = (f(i-1) + m) % n
其中n为参加游戏的总人数,m为第m个报数,i为当前剩余人数,f(i)为最后一个人的编号
当n为6,m为2时,可得递推表格
n | m | 胜利者编号(从0开始) | 编号 | |
---|---|---|---|---|
6 | 2 | 设为y y = (x+m)%n | 4 | 0 1 2 3 4 5 |
5 | 2 | 设为x | 2 | 0(2) 1(3) 2(4) 3(5) 4(0) |
4 | 2 | (2+2)%4 | 0 | 0 1 2 3 |
3 | 2 | (0+2)%3 | 2 | 0 1 2 |
2 | 2 | (0+2)%2 | 0 | 0 1 |
1 | 2 | 0 | 0 | 0 |
3.python代码
def josephus(n,m):
if n < 2:
return 0
f = [0] * (n+1)
# 注意编号从0开始
f[1] = 0
for i in range(2,n+1):
f[i] = (f[i-1] + m) % n
return f[n]
print('answer is: ',josephus(41,3))