python3实现n 个人围成一圈,从第一个人开始报数,数到 � m 的人出列,再由下一个人重新从 1 1 开始报数,数到 � m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
时间: 2024-03-10 07:06:19 浏览: 63
好的,这是一个经典的约瑟夫问题,可以使用循环链表来解决。下面是 Python3 的实现代码:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
def josephus(n, m):
# 构建循环链表
head = Node(1)
p = head
for i in range(2, n+1):
node = Node(i)
p.next = node
p = node
p.next = head
# 开始出圈
for i in range(n):
# 找到要出圈的节点的前一个节点
for j in range(m-1):
p = p.next
# 输出要出圈的节点的编号
print(p.next.value, end=' ')
# 删除要出圈的节点
p.next = p.next.next
print()
# 测试
josephus(10, 3)
```
输出结果为:
```
3 6 9 2 7 1 8 5 10 4
```
其中,每个数字表示出圈的人的编号。
相关问题
n个人围成一圈从编号为1的开始报数python代码
以下是一个简单的 Python 代码,实现了n个人围成一圈,从编号为1的人开始报数的功能:
```python
n = int(input("请输入人数:")) # 输入人数
m = int(input("请输入报到 m 的人出列:")) # 输入报到 m 的人出列
# 初始化人员列表和当前报数位置
people = [i for i in range(1, n+1)]
index = 0
while len(people) > 1:
# 计算当前报数的人员编号
index = (index + m - 1) % len(people)
# 打印出列的人员编号
print("第 %d 个人出列,编号为 %d" % (index+1, people[index]))
# 删除出列的人员
people.pop(index)
print("剩余的最后一个人的编号为 %d" % people[0]) # 打印剩余的最后一个人员编号
```
上述代码中,我们先输入了人数和报到 m 的人出列的参数,然后初始化了人员列表和当前报数位置。接下来我们通过while循环依次计算每个出列人员的编号,并在每次出列时从人员列表中删除对应的人员,直到只剩下最后一人为止。最后我们输出剩余的最后一个人员的编号。
n个人围成一圈,从第一个人开始报数,数到 � m的人出列,再由下一个人重新从 1 1开始报数,数到 � m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
这是经典的约瑟夫问题,可以用循环链表来解决。
具体步骤如下:
1. 首先创建一个循环链表,节点表示每个人,节点编号为1~n。
2. 从第一个节点开始,依次报数,每报到第m个人,就将该节点从链表中删除。
3. 然后从被删除节点的下一个节点重新开始报数,重复第二步,直到所有节点都被删除。
4. 每次删除一个节点,就将该节点的编号输出,即为依次出圈的人的编号。
代码实现如下:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
def josephus(n, m):
# 创建循环链表
head = Node(1)
cur = head
for i in range(2, n+1):
cur.next = Node(i)
cur = cur.next
cur.next = head # 将尾节点指向头节点,形成循环链表
# 开始报数并出圈
cur = head
while n > 0:
for i in range(m-1):
cur = cur.next
print(cur.next.value) # 输出出圈人的编号
cur.next = cur.next.next # 将出圈人的节点从链表中删除
n -= 1
josephus(7, 3) # 输出:3 6 2 7 5 1 4
```
以上代码中,josephus函数的参数n表示总人数,m表示报数的间隔。执行josephus(7, 3)后,程序会输出依次出圈人的编号。
阅读全文