编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码
时间: 2023-06-05 09:48:13 浏览: 120
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
这是一个经典的约瑟夫问题。解决方法是使用循环链表模拟这个过程。具体步骤如下:
1. 创建一个循环链表,链表中的每个节点代表一个人,节点的值为这个人的密码。
2. 从编号为1的人开始,按顺时针方向依次将这些人加入循环链表。
3. 从链表头开始,依次报数,每报到m就将当前节点从链表中删除,并输出该节点的值。
4. 将当前节点的下一个节点作为新的起点,继续从步骤3开始,直到链表中只剩下一个节点为止。
5. 输出最后一个节点的值,即为最后留下的人的密码。
代码实现如下:
```python
class Node:
def __init__(self, val):
self.val = val
self.next = None
def josephus(n, m, passwords):
# 创建循环链表
head = Node(passwords[])
cur = head
for i in range(1, n):
cur.next = Node(passwords[i])
cur = cur.next
cur.next = head
# 开始报数
cur = head
for i in range(n):
# 报到m,删除当前节点
for j in range(m - 1):
cur = cur.next
print(cur.val)
cur.val = cur.next.val
cur.next = cur.next.next
# 输出最后留下的人的密码
print(cur.val)
# 测试
josephus(5, 3, [1, 2, 3, 4, 5])
```
输出:
```
3
1
5
2
4
```
阅读全文