写出代码编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将它的密码作为新的m值,从它的顺时针方向的下一个人开始重新从1报数,如此下去,直至全部人出列为止。最后按照出列的顺序输出各人的编号
时间: 2023-10-20 19:07:19 浏览: 77
好的,这是一个经典的约瑟夫环问题。以下是我给出的 Python 代码实现。
```python
def josephus(n, m, passwords):
# 初始化编号和密码列表
nums = list(range(1, n+1))
# 记录出列顺序的列表
order = []
# 当还有人没出列时
while nums:
# 计算当前报数的人在列表中的索引
index = (m - 1) % len(nums)
# 将当前报数的人的密码作为新的m值
m = passwords[nums[index]-1]
# 将当前报数的人从列表中移除并添加到出列顺序的列表中
order.append(nums.pop(index))
# 返回出列顺序
return order
# 测试
n = 7
m = 3
passwords = [7, 6, 5, 4, 3, 2, 1]
print(josephus(n, m, passwords)) # [3, 6, 2, 7, 5, 1, 4]
```
在上面的代码中,我们使用了一个列表来记录编号为 1 到 n 的人。每次报数时,计算出当前报数的人在列表中的索引,将其从列表中移除并添加到出列顺序的列表中。同时,将当前报数的人的密码作为新的 m 值。最后返回出列顺序的列表。
相关问题
n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码
每个人按顺时针方向围坐一圈,每人持有一个密码(整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报数为m的人出圈,同时留下他的密码。然后从他的下一个人开始重新报数,重复上述过程,直到剩下最后一个人为止。报m的人出圈,并留下他的密码。
约瑟夫(joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
此题是关于约瑟夫问题的一种描述:编号为1,2…n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人出列为止。试设计一个程序求出出列顺序。
阅读全文