实现一个功能无非就是合适的数据结构+算法.
要实现这个需求,首先想到的简单算法就是用一个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号.