用三种存储结构(顺序表,链表,静态链表)求解josuphu问题;设有n个人围坐在一圈,现从指定的第个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,如此重复,直到所
时间: 2023-05-01 07:07:21 浏览: 97
该问题涉及到约瑟夫问题,即$n$个人围成一圈,从指定的第一个人开始报数,在报到第$m$个人出列后,再从下一个人开始重新报数,直到所有人全部出列为止。 解决该问题有多种存储结构(顺序表,链表,静态链表)和算法(递归,迭代,数学公式)。
相关问题
一堆猴子都有编号,编号是1,2,3m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
好的,这是一个经典的约瑟夫问题,可以使用数组和链表两种方式来解决。
首先,我们来看数组的实现方式。假设有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)
```
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n要求从键盘输入,存储方式采用链表实现该问题求解。
以下是Python实现的代码:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
def create_linked_list(n):
head = Node(1)
curr = head
for i in range(2, n+1):
node = Node(i)
curr.next = node
curr = node
curr.next = head
return head
def josephus_circle(head, n):
prev = head
while prev.next != head:
prev = prev.next
curr = head
count = 1
while curr != curr.next:
if count == n:
count = 1
print("Monkey", curr.data, "leaves the circle.")
prev.next = curr.next
curr = prev.next
else:
count += 1
prev = curr
curr = curr.next
print("Monkey", curr.data, "is the king of the circle!")
m = int(input("Enter the total number of monkeys: "))
n = int(input("Enter the 'n' to count: "))
head = create_linked_list(m)
josephus_circle(head, n)
```
首先定义一个`Node`类表示链表中的每个节点,具有`data`和`next`两个属性,其中`data`表示猴子的编号,`next`表示下一个节点。
`create_linked_list(n)`函数用来创建一个包含`1`到`n`的循环链表,返回链表的头节点`head`。
`josephus_circle(head, n)`函数实现约瑟夫环问题的求解过程,其中`head`为循环链表的头节点,`n`表示每数到第`n`个猴子就要离开圈。在循环中,用`prev`指向当前节点的前一个节点,用`curr`指向当前节点,用`count`表示当前轮到第几只猴子。每数到第`n`只猴子,将该猴子从循环链表中删除,并输出该猴子的编号。最后剩下的猴子即为大王,输出其编号即可。
在`main`函数中,从键盘输入总猴子数和`n`,创建循环链表并调用`josephus_circle`函数求解。