欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

程序员文章站 2022-04-16 16:25:54
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位移除报数为3的人,剩下的人继续报数,此时需要把前面已经报过数的人移到末尾,然后再从头报数,这样就满足了顺序要求。也就是删除一个报数为3的人,就要通过move()移动一次#轮转交换函数,def move(m,arr,n): arr_new = [0]*n for j in range(n): arr_new[(j+m)%n] = arr[j] ret...

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

移除报数为3的人,剩下的人继续报数,此时需要把前面已经报过数的人移到末尾,然后再从头报数,这样就满足了顺序要求。也就是删除一个报数为3的人,就要通过move()移动一次

#轮转交换函数,
def move(m,arr,n):
    arr_new = [0]*n
    for j in range(n):
        arr_new[(j+m)%n] = arr[j]
    return arr_new

#循环删除3的倍数成员
def dele(p):
    while len(p)>2:
        #移除报数为3的人,剩下的人继续报数,此时需要把前面已经报过数的人移到末尾,
        #然后从头报数,也就是删除一个人就要通过move函数移动一次
        p.remove(p[2])
        p = move(len(p)-2,p,len(p))

        if len(p) == 2:
            print(p[1])
            break

if __name__ == '__main__':
    #把每个人的编号作为列表元素 ,列表为p
    person = int(input("请输入总人数:"))  
    p = []
    for i in range(0, person):
        p.append(i + 1)  
    print(p)
    #淘汰报数为3的函数
    dele(p)

运行结果:
小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
总人数为10 的时候,最后一个剩余的人为原先的4号

本文地址:https://blog.csdn.net/qq_41761265/article/details/107646887

推荐阅读