一堆猴子都有编号,编号是1,2,3m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2024-02-29 20:51:34 浏览: 21
好的,这是一个经典的约瑟夫问题,可以使用数组和链表两种方式来解决。
首先,我们来看数组的实现方式。假设有m只猴子,我们可以定义一个长度为m的布尔型数组,用于表示每只猴子是否还在圈中。然后,我们可以使用一个循环来模拟猴子们离开圈的过程。每次循环都从第一个猴子开始数数,直到数到第n只猴子,然后将该猴子从圈中移除。当所有猴子都离开圈时,最后留下的猴子就是大王。
下面是数组方式的代码实现:
```python
m = int(input("请输入猴子总数:"))
n = int(input("请输入每次数的数字:"))
# 初始化猴子的状态数组
monkeys = [True] * m
# 模拟猴子离开圈的过程
count = 0
index = 0
while count < m - 1:
i = 0
while i < n:
if monkeys[index]:
i += 1
if i == n:
monkeys[index] = False
count += 1
index = (index + 1) % m
# 找出最后留下的猴子
for i in range(m):
if monkeys[i]:
print("大王是第%d只猴子。" % (i + 1))
break
```
接下来,我们来看链表的实现方式。假设我们使用一个循环链表来表示猴子们围坐的圈。我们可以先创建一个包含m个节点的循环链表,每个节点表示一个猴子,然后将链表头指针指向第一个猴子。接着,我们可以使用一个指针p来遍历链表,每次数到第n只猴子时,就将该猴子从链表中删除。当链表中只剩下一个节点时,该节点所表示的猴子就是大王。
下面是链表方式的代码实现:
```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):
p.next = Node(i)
p = p.next
p.next = head
# 模拟猴子离开圈的过程
count = 0
while p.next != p:
count += 1
if count == n:
count = 0
print("猴子%d离开圈。" % p.data)
q = p
while q.next != p:
q = q.next
q.next = p.next
else:
p = p.next
# 输出最后剩下的猴子
print("大王是猴子%d。" % p.data)
```