当前位置: 移动技术网 > IT编程>开发语言>.net > 小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

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

2020年07月30日  | 移动技术网IT编程  | 我要评论

有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)

运行结果:
这里插入图片描述
总人数为10 的时候,最后一个剩余的人为原先的4号

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网