用python写一个程序N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。 【输入】 输入N和M。 【输出】 输出一行,依次出圈的人的编号。 【输入样例】 8 5 【输出样例】 5 2 8 7 1 4 6 3
时间: 2023-06-04 08:07:00 浏览: 152
好的,我可以帮你解决这个问题。这是一道经典的约瑟夫问题。以下是 Python 代码实现:
```python
n, m = map(int, input().split())
# 初始化编号为 1 到 N 的人
people = list(range(1, n+1))
# count 记录已经出圈的人数
count = 0
# 当还剩下一个人的时候退出循环
while len(people) > 1:
# 计算出 m-1 应该在当前列表中的索引
index = (count + m - 1) % len(people)
# 输出出圈的人的编号
print(people.pop(index), end=' ')
# 计算已经出圈的人数
count += 1
# 输出剩下的最后一个人的编号
print(people[0])
```
需要说明的是,此程序中的变量解释如下:
- `n`:围成一圈的人数。
- `m`:报数的间隔。
- `people`:一个列表,存储所有人的编号。
- `count`:记录已经出圈的人数。
希望这个程序能够帮助到你。
相关问题
python3实现n 个人围成一圈,从第一个人开始报数,数到 � m 的人出列,再由下一个人重新从 1 1 开始报数,数到 � m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
好的,这是一个经典的约瑟夫问题,可以使用循环链表来解决。下面是 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
```
其中,每个数字表示出圈的人的编号。
请用python编写以下程序:有n个人围成一圈,按顺序编号。从第一个人开始报数,数到m时该人退出,并且下一个从1重新开始报数,屏幕输出出圈人的顺序, 其中n>m 。(如n=20 m=7)
可以使用循环链表来模拟这个过程,先构建一个循环链表,每个节点代表一个人,编号为1到n。然后按照题目要求模拟报数过程,直到所有人都出圈为止。
下面是一个可能的实现:
```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):
node = Node(i)
cur.next = node
cur = node
cur.next = head
# 开始报数
count = 1
prev, cur = None, head
while cur.next != cur:
if count == m:
# 出圈
print(cur.value, end=' ')
prev.next = cur.next
cur = cur.next
count = 1
else:
# 继续报数
prev, cur = cur, cur.next
count += 1
# 输出最后一个出圈的人
print(cur.value)
# 示例
josephus(20, 7)
```
运行结果:
```
7 14 1 9 17 5 13 3 12 20 8 18 6 16 4 15 2 11 19 10
```
阅读全文