约瑟夫环问题 - 哪些人下船

有一条船,船上有30个人,船只能坐16个,要下14个,起码循环14次,对30 个人进行编号,从1开始,每数到第七个就下船,最后输出哪些人下船。

# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

方法一:

设置一个变量 out 作为要下船人的下标

从下标为0数到下标为6,即第7个人,将它删除,输出作为下船的人,所以第一个下船的人下标就为6,此时删除后的下标后一位向前面补齐,即 ‘7’删除后,8的下标就变成了6,所以后面删除的人只需要再加6,就能删除 ‘14’。以此类推。

merberlist = list(range(1, 31))
out = 6
while len(merberlist) > 16:
    if out < len(merberlist):
        print("下船的人:", merberlist.pop(out))
        out += 6
    else:
        out = out - len(merberlist)
        print("下船的人:", merberlist.pop(out))
        out += 6

下船的人: 7
下船的人: 14
下船的人: 21
下船的人: 28
下船的人: 5
下船的人: 13
下船的人: 22
下船的人: 30
下船的人: 9
下船的人: 18
下船的人: 27
下船的人: 8
下船的人: 19
下船的人: 1

Process finished with exit code 0

方法二:

删除列表第一个元素,然后在列表的末尾再将它添加进来,直到第七个人,就只将其删除,不再添加,输出来作为要下船的人。

merberlist = list(range(1, 31))
i = 0
while len(merberlist) > 16:
    if i < 6:
        merberlist.append((merberlist.pop(0)))
        i += 1
    else:
        print("要下船的人:", merberlist.pop(0))
        i = 0

E:\python\python3.9.1\python.exe E:/tlbb/约瑟夫环问题/谁下船.py
要下船的人: 7
要下船的人: 14
要下船的人: 21
要下船的人: 28
要下船的人: 5
要下船的人: 13
要下船的人: 22
要下船的人: 30
要下船的人: 9
要下船的人: 18
要下船的人: 27
要下船的人: 8
要下船的人: 19
要下船的人: 1

posted @   JackLovey3  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示