约瑟夫环

已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。

MyCode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def josephus_problem(maxnum, startnum, stepnum):
# 创建一个包含从startnum%maxnum到maxnum+1的列表,再加上从1到startnum%maxnum-1的列表
data = list(range(startnum % maxnum, maxnum + 1)) + list(range(1, startnum % maxnum))
num = 0 # 初始化计数器
while len(data) > 1: # 当列表长度大于1时执行循环
num += 1 # 计数器加1
temp = data.pop(0) # 弹出列表中的第一个元素
if num == stepnum: # 如果计数器等于步长
print(temp) # 输出当前元素
num = 0 # 重置计数器
else:
data.append(temp) # 将当前元素添加到列表末尾
print(data[0]) # 输出列表中剩余的唯一元素

n, k, m = map(int, input().split()) # 读取输入的三个整数
josephus_problem(n, k, m) # 调用约瑟夫问题函数

约瑟夫环
https://ianwusb.blog/2024/03/17/约瑟夫环/
作者
Ianwusb
发布于
2024年3月17日
许可协议