几个人围圈循环报数,计算最后剩下的是哪一位

本文探讨了约瑟夫环问题,通过一个简单的例子解释了如何通过编程解决这个问题。使用了一个易于理解的方法,通过循环和计数器来模拟游戏过程,最终找出获胜者。

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

原图:有n个人围成一圈,顺序排号。从第一个人开始报数(从13报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
解题思路:假设五个人
1 2 3 4 5  第一次 就是 12312  就只剩下1245 此时再从第一位的时候就是3123 只剩下24 再接着就是12,再31 最后就只剩下4了。
难点就是怎么把整个读书循环起来,循环起来后,读到3的就剔除,这样到最后就只会剩下一个了。
网上有几种解题思路,有的复杂还不易读懂,下面这个是我看到的最容易懂的。
def example6(n):
    """
    :param n: 人数 
    :return: 最后胜出者
    """
    baoshu=0
    num=[i for i in range(1,n+1)]  #初始化人 从1开始
    while len(num)>1:   #长度为1的时候停止,num[0]就是胜出者
        baoshu+=1  #计数器
        num.append(num.pop(0))  #计数器执行一次,就把第一位数放到list的最后,达到循环读数的效果
        if baoshu==3:
            baoshu=0 #读三次,碰到的数字就是要移除的数字
            num.pop() #读三次的时候,第三个数字被放到了list的最后面,所以直接pop()移除最后一个
    print (num)

总结:灵活使用pop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值