(python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿

博客探讨了约瑟夫环问题的解决方案,通过Python编程实现。当n个人顺时针围成一圈,从编号1开始每隔一人淘汰,直至剩下两人。文章详细解释了算法逻辑,特别是对于偶数和奇数情况的处理,并给出输出两名幸运儿起始位置的代码结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约瑟夫(Josephus)环问题
题目:n个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一
人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。
如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(3<=n<=50)
输入:开始时的人数n。
输出:第1行是选出顺序,第2行是两名幸运儿的开始位置(按升序排列),位置编号之
间用一个空格分开。
**理解:这个输入的数不管是奇数还是偶数第一轮淘汰的都是2的倍数,但是以后的话,偶数是淘汰位置在2的倍数上的那个数,奇数是把上轮最后一个数放到第一个数后的位置在2的倍数上的那个数。

n=int(input('请输入n(3<n<=50):'))
list1=[]
list2=[]
#运用一个循环,把人添加到list1里面
for i in range(1,n+1):
    list1.append(i)
#定义一个函数,用这个函数进行第一轮的筛选,把是号码是2的倍数的人给删除。
def g1():
    for i in list1:
        if i%2==0:
            list1.remove(i)
            list2.append(i)
        else:pass
#这个函数用来输出最后的答案
def shuchu():
    print(list2)
    print(list1)
list3=list1
#定义一个函数,进行第二轮筛选,把位置号码是2的倍数的人,给删除。
def erci():
    if len(list1)>2:#判断一下这个列表1里面的人数是否符合题意。
        list4 = []
        #利用for循环把下标不是i2倍数的添加到列表里
        for i in range(len(list1)):
            if i % 2 != 0:
                list4.append(list1[i])
         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值