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