一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2023-09-26 17:06:25 浏览: 93
python 有n个人围成一圈,顺序排号,问最后留下的是原来第几号的那位。(示例)
5星 · 资源好评率100%
### 回答1:
使用数组实现:
```python
m = int(input("请输入猴子的数量:"))
n = int(input("请输入数到第几只猴子出圈:"))
monkeys = [i for i in range(1, m+1)] # 生成猴子编号的数组
current = 0 # 当前数到的猴子的编号
for i in range(m-1): # 循环m-1次,直到只剩一只猴子
current = (current + n - 1) % len(monkeys) # 计算出圈的猴子的编号
print("第{}只猴子出圈了".format(monkeys[current]))
monkeys.pop(current) # 删掉出圈的猴子
print("最后剩下的猴子是{}".format(monkeys[0]))
```
使用链表实现:
```python
# 链表节点类
class Node:
def __init__(self, value):
self.value = value
self.next = None
m = int(input("请输入猴子的数量:"))
n = int(input("请输入数到第几只猴子出圈:"))
# 构建循环链表
head = Node(1)
current = head
for i in range(2, m+1):
node = Node(i)
current.next = node
current = node
current.next = head # 链表尾部指向头部,形成循环链表
# 开始出圈
current = head
while current.next != current: # 只剩一只猴子时结束循环
for i in range(n-2): # 找到应该出圈的猴子的前一个猴子
current = current.next
print("第{}只猴子出圈了".format(current.next.value))
current.next = current.next.next # 删除出圈的猴子
current = current.next # 下一个猴子开始数数
print("最后剩下的猴子是{}".format(current.value))
```
我们可以将以上代码打包成一个函数,方便调用:
```python
def monkey_king(m, n, method='array'):
if method == 'array':
monkeys = [i for i in range(1, m+1)]
current = 0
for i in range(m-1):
current = (current + n - 1) % len(monkeys)
print("第{}只猴子出圈了".format(monkeys[current]))
monkeys.pop(current)
print("最后剩下的猴子是{}".format(monkeys[0]))
elif method == 'linkedlist':
class Node:
def __init__(self, value):
self.value = value
self.next = None
head = Node(1)
current = head
for i in range(2, m+1):
node = Node(i)
current.next = node
current = node
current.next = head
current = head
while current.next != current:
for i in range(n-2):
current = current.next
print("第{}只猴子出圈了".format(current.next.value))
current.next = current.next.next
current = current.next
print("最后剩下的猴子是{}".format(current.value))
else:
print("无效的方法选择")
```
我们可以通过函数名选择使用数组还是链表实现:
```python
monkey_king(10, 3, 'array')
monkey_king(10, 3, 'linkedlist')
```
### 回答2:
使用数组方式实现:
1. 首先,从键盘输入m和n的值。
2. 创建一个长度为m的数组,用来存储猴子的编号。
3. 使用循环,将1至m依次存入数组中。
4. 创建一个变量index,初始值为0,用来表示当前已经数到的猴子的位置。
5. 创建一个变量count,初始值为1,用来表示已经数到的数字。
6. 使用循环,直到只剩下最后一个猴子时结束循环:
- 在数组中找到当前位置index对应的猴子的编号。如果猴子编号为0,则表示该猴子已经离开圈了,跳过此次循环。
- 如果count是n的倍数,说明要离开圈的猴子,将该猴子的编号设置为0,同时count重置为1。
- 如果count不是n的倍数,说明猴子还不用离开圈,count加1。
- index加1,如果已经超过数组的长度,则从头开始继续数。
7. 循环结束后,找出数组中最后一个不为0的元素,即为大王的编号。
使用链表方式实现:
1. 首先,从键盘输入m和n的值。
2. 创建一个长度为m的链表,用来存储猴子的编号。
3. 使用循环,将1至m依次插入链表中。
4. 创建一个指针current,初始值为链表的头节点,用来表示当前已经数到的猴子。
5. 创建一个变量count,初始值为1,用来表示已经数到的数字。
6. 使用循环,直到链表中只剩下最后一个猴子时结束循环:
- 如果count是n的倍数,说明要离开圈的猴子,将current指针指向的节点从链表中移除,并将count重置为1。
- 如果count不是n的倍数,说明猴子还不用离开圈,count加1。
- 将current指针指向下一个节点,如果已经到达末尾节点,则将current指针重新指向链表的头节点。
7. 循环结束后,current指针指向的节点即为大王的编号。
注意:在链表实现方式中,需要使用一个指针prev来保存上一个节点,以便在移除节点时更新链表的连接关系。
### 回答3:
数组实现:
```python
def king_monkey_array(m, n):
monkeys = [i for i in range(1, m+1)]
index = 0
while len(monkeys) > 1:
index = (index + n - 1) % len(monkeys) # 计算要删除的猴子在数组中的索引
monkeys.pop(index)
return monkeys[0]
m = int(input("请输入猴子的数量:"))
n = int(input("请输入每数到第几个猴子要离开:"))
result = king_monkey_array(m, n)
print("大王猴子的编号是:", result)
```
链表实现:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
def king_monkey_linked_list(m, n):
head = Node(1)
pre = head
for i in range(2, m+1):
node = Node(i)
pre.next = node
pre = node
pre.next = head # 链表形成环
while pre.next != pre:
for _ in range(n-1):
pre = pre.next
pre.next = pre.next.next
return pre.value
m = int(input("请输入猴子的数量:"))
n = int(input("请输入每数到第几个猴子要离开:"))
result = king_monkey_linked_list(m, n)
print("大王猴子的编号是:", result)
```
以上是用Python语言实现的,采用了数组和链表两种方式分别求解该问题。用户需要从键盘输入猴子的数量m和每次数到第几个猴子要离开n,程序将计算出最后剩下的猴子的编号并输出。
阅读全文