python循环题目:有N个人(编号为1-N)围成一个圈,从编号为1的人开始报数,报数的范围是1~M,报到M的人出圈,下一个人重新从1开始报数,直到留下最后一个人,问最后一个人的编号是多少?

遇到一个python循环题目:有N个人(编号为1-N)围成一个圈,从编号为1的人开始报数,报数的范围是1~M,报到M的人出圈,下一个人重新从1开始报数,直到留下最后一个人,问最后一个人的编号是多少?

答:这是一个循环的问题,解决的问题主要有:
1,需要将报到数为M的人排除;
2,报数过程中索引不能因为有人排除而断掉,如何让索引在最后一名与开始一名接上;
3,最后一个人的编号与索引的关系。

那么开始写代码了!

# N为你设置的总人数,M为你选择的报数,方便验证此次选了8和3
N, M = 8, 3
# 围成圈后,有人的地方都为True
persons = [True] * N
# total为总人数,开始为N,以后每当遇到报数为M时,total应该就会排除一个人。
# num为报数值最大为M。
# index 为圈的索引起始为0,最大为 total-1
total, num, index = N, 0, 0

# 当总人数大于1之前都应该继续报数
while total > 1:
	# 当有人的索引时
    if persons[index]:
        num += 1
        #当报数到M时应该讲此编号的人排除圈外
        if num == M:
            persons[index] = False
            total, num = total - 1, 0
    # 虽然人被排除了,但是索引还得继续增加起来,当增加到N的时候,索引为0,相当于报数了一圈,所以用index %= N来连接。
    index += 1
    index %= N
# 当total等于1的时候,while循环结束,此时需要找到列表中还为True的索引,此索引由于是从0开始,故与编号值之间的关系为编号-1=索引
for index, person in enumerate(persons):
    if person:
        print(index + 1)
        break

得到最终结果为:7
希望能帮助小伙伴解决此题。么么哒!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值