一堆猴子都有编号,编号是1,2,3m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2024-03-10 10:46:22 浏览: 51
python 有n个人围成一圈,顺序排号,问最后留下的是原来第几号的那位。(示例)
5星 · 资源好评率100%
好的,这是一道经典的约瑟夫问题。我们可以分别用数组和链表两种方式实现。
首先是数组实现,思路如下:
1. 定义一个长度为m的数组,用来表示这些猴子是否还在圈中;
2. 定义一个变量count表示剩余在圈中的猴子数量,开始为m;
3. 定义一个变量num表示当前数到第几只猴子,开始为1;
4. 从第一个猴子开始循环,每次循环num+1;
5. 如果当前猴子在圈中,判断num是否为n,如果是,将该猴子从圈中删除(即将数组对应位置置为0),count减1,num重置为1;
6. 如果当前猴子已经离开圈了,num不变;
7. 如果count为1,表示只剩下最后一个猴子了,循环结束,输出该猴子的编号即可。
下面是用数组实现的Python代码:
```python
m = int(input("请输入猴子的数量:"))
n = int(input("请输入每次数的数字:"))
# 初始时所有猴子都在圈中
monkeys = [1] * m
count = m
num = 1
while count > 1:
for i in range(m):
if monkeys[i] == 1:
if num == n:
monkeys[i] = 0
count -= 1
num = 1
else:
num += 1
if count == 1:
for i in range(m):
if monkeys[i] == 1:
print("最后剩下的猴子编号为:", i+1)
break
```
接下来是链表实现,思路如下:
1. 定义一个单向循环链表,包含m个节点,每个节点表示一个猴子;
2. 定义一个变量count表示剩余在圈中的猴子数量,开始为m;
3. 定义一个变量num表示当前数到第几只猴子,开始为1;
4. 从第一个猴子开始循环,每次循环num+1;
5. 如果当前猴子在圈中,判断num是否为n,如果是,将该猴子从圈中删除,count减1,num重置为1;
6. 如果当前猴子已经离开圈了,num不变;
7. 如果count为1,表示只剩下最后一个猴子了,循环结束,输出该猴子的编号即可。
下面是用链表实现的Python代码:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
m = int(input("请输入猴子的数量:"))
n = int(input("请输入每次数的数字:"))
# 创建一个单向循环链表
head = Node(1)
p = head
for i in range(2, m+1):
node = Node(i)
p.next = node
p = node
p.next = head
count = m
num = 1
while count > 1:
for i in range(n-1):
p = p.next
p.next = p.next.next
count -= 1
num = 1
if count == 1:
print("最后剩下的猴子编号为:", p.data)
```
以上就是两种方式实现约瑟夫问题的代码,希望对你有帮助!
阅读全文