有n个人编号为1~n排成一个环从1号人开始从1到m报数报到m的人离开该环从下一个人开始继续从1到m报数报到m的人离开该环这样一直进行下去直到最终剩余p个人。从键盘输入n、m、p要求n>=2、m>=2、p<n输出最终剩余的p个初始编号。采用何种物理结构
这个问题可以使用循环链表来实现。
首先,我们可以创建一个长度为n的循环链表,每个节点表示一个人,并且节点的值表示人的编号。
然后,我们从1号人开始,依次数m个节点,当数到第m个节点时,将该节点从链表中删除。
重复上述步骤,直到链表中只剩下p个节点为止。
最后,输出剩余节点的值即为最终剩余的p个初始编号。
以下是一个使用Python实现的示例代码:
class Node:
def __init__(self, value):
self.value = value
self.next = None
def josephus(n, m, p):
# 创建循环链表
head = Node(1)
curr = head
for i in range(2, n+1):
curr.next = Node(i)
curr = curr.next
curr.next = head
# 开始报数并删除节点
while n > p:
for _ in range(m-1):
curr = curr.next
curr.next = curr.next.next
n -= 1
# 输出剩余节点的值
result = []
for _ in range(p):
result.append(curr.value)
curr = curr.next
return result
# 从键盘输入n、m、p
n = int(input("请输入n:"))
m = int(input("请输入m:"))
p = int(input("请输入p:"))
# 调用函数并输出结果
result = josephus(n, m, p)
print("最终剩余的p个初始编号为:", result)
在这个示例代码中,使用了一个Node类来表示链表的节点,每个节点有一个value属性表示节点的值,一个next属性表示下一个节点。
函数josephus接受三个参数n、m、p,代表初始人数、报数的间隔和最终剩余的人数。
首先,创建一个循环链表,然后通过循环和计数的方式,依次数m个节点,并将第m个节点从链表中删除,直到链表中只剩下p个节点为止。
最后,将剩余节点的值存入一个列表中,并返回该列表作为结果
原文地址: https://www.cveoy.top/t/topic/hLao 著作权归作者所有。请勿转载和采集!