用python实现n个人围圈,报到m的人退出,最终留下几号的功能.

实现一个功能无非就是合适的数据结构+算法.

要实现这个需求,首先想到的简单算法就是用一个flag来表示每个人报到的数,如果flag==m则报到此数的人退出.若剩余总人数等于一个时,则算法结束,此时这个人的号码就是要求出的数.

此时若要表示一个人的状态,需要两个值:①此人的号码. ②此人是否已经被淘汰. 很自然的想到用数组这个数据结构来实现–数组下标表示号码,数组内容表示是否被淘汰.

但python没有数组这种结构,但是有列表,经过搜索,python的列表是保证顺序的,也就是通过下标索引到的元素的内容不会变动.

代码:

# num总人数,m人退出的间隔数
def circle(num,m):
    if(not(num>1 and m>1)):
        exit(1)
    people = [True] * num  # 人数列表,True代表有人,False代表没人.
    flag = 0
    while (num != 1):
        for i in range(0, len(people)):
            if (people[i] == True):
                flag += 1
            if (flag == m):  #人退出的间隔数
                people[i] = False
                num -= 1
                flag = 0
    for i in range(0, len(people)):
        if (people[i] == True):
            return i+1
            
num=int(input("n个人,n="))
print(f"留下了第{circle(num,3)}号.")

输出:

n个人,n=2
留下了第2号.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值