实现一个功能无非就是合适的数据结构+算法.
要实现这个需求,首先想到的简单算法就是用一个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号.
本文深入探讨了约瑟夫环问题的解决方法,通过使用列表作为数据结构,实现了每m个人报数一次,直到剩下最后一人。文章详细介绍了算法流程,包括初始化人数列表、设置标志变量以及循环判断条件。
954

被折叠的 条评论
为什么被折叠?



