这个问题可以使用循环链表来实现。

首先,我们可以创建一个长度为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个节点为止。

最后,将剩余节点的值存入一个列表中,并返回该列表作为结果

有n个人编号为1~n排成一个环从1号人开始从1到m报数报到m的人离开该环从下一个人开始继续从1到m报数报到m的人离开该环这样一直进行下去直到最终剩余p个人。从键盘输入n、m、p要求n>=2、m>=2、p<n输出最终剩余的p个初始编号。采用何种物理结构

原文地址: https://www.cveoy.top/t/topic/hLao 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录