约瑟夫问题是一道很经典的问题,题目内容如下:
n个人排成一圈,从某个人开始,按顺时针方向从1开始依次编号。从编号为1的人开始顺时针“1,2,3,…,m,1,2,3,…”报数,报到m(m>1)的人退出圈子。这样不断循环下去,圈子里的人数将不断减少。由于人数是有限的(n个),因此最终会只剩下一个人。试问最后剩下的人的初始编号是多少?
既然是一个循环报数,我们是不是可以用循环结构配上队列来做呢?想到这里,方向就很明确了。创建一个长度为n,元素为1-n的整数(代表n个人的编号)的队列,进行如下循环:在报数没报到m时,队列头部数字出队再入队,到达队尾,报数到m时删除队列头部数据,这样循环下去直到队列长度为1,此时剩下的那个数字就是最后剩下的人的初始编号。
代码如下:
n=int(input())
m=int(input())
lst=[i for i in range(1,n+1)]
while len(lst)>1:
n=1
while n<m:
a=lst[0]
lst=lst[1:]
lst.append(a)
n+=1
lst=lst[1:]
print(lst[0])