用python解答:设编号为1,2,3,…,N的(N>0)N个人按顺时针方向围坐一圈,每个人持有一个正整数密码(密码随机产生)。开始时任选一个正整数作为报数上限M,现从第K个人开始顺时针方向自1起顺序报数,报到M时停止报数,报M的人出列,将他的密码作为新的M值,接着从出列的下一个人开始重新从1报数,数到M的人又出列,如此下去到所有的人都出列为止。要求设计一个程序模拟此过程,输出他们的出列编号序列。
时间: 2023-10-20 15:05:26 浏览: 144
约瑟夫环实现编号是1,2,……,n的n个人按照顺时针方向围坐一圈
5星 · 资源好评率100%
好的,下面是用 Python 实现约瑟夫环问题的代码:
```python
def josephus(N, M, K):
# 构造初始密码和编号列表
passwords = [i + 1 for i in range(N)]
nums = list(range(1, N + 1))
# 记录出列的编号序列
out_nums = []
# 记录当前报数的人的下标
idx = K - 1
# 开始循环,直到所有人都出列
while len(nums) > 0:
# 报数,如果报到M就出列
if len(nums) > M:
idx = (idx + M - 1) % len(nums)
else:
idx = (idx + M - 1) % len(nums)
out_nums.append(nums.pop(idx))
break
# 将出列的人的密码作为新的M值
M = passwords[idx]
# 将出列的人从列表中删除,并记录出列编号
out_nums.append(nums.pop(idx))
return out_nums
```
这个函数接受三个参数:N 表示有 N 个人,M 表示每次数到 M 就出列,K 表示从第 K 个人开始报数。函数中使用两个列表来分别记录每个人的密码和编号。然后使用一个循环不断报数,如果报到 M 就出列,并将出列人的密码作为新的 M 值。直到所有人都出列为止,返回出列的编号序列。
阅读全文