一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
代码如下
n=int(input ())
lst=list(range (1, n+1))
i=-1
while len(lst)>1:
i=i+3
i=i%len(lst)
del lst[i]
i=i-1
print(lst[0])
首先将n只猴子放在一个列表中,通过while循环不断剔除猴子,这里设置i=-1和后面的i+3是为了让第一个被剔除的索引是2,即报到3的猴子,之后列表元素减少一个,在第三个之后的猴子的索引变为了前一个猴子的索引,所以要减去1,较难理解的是为什么要用i除列表长度并取余数。在这里随着i的增加,会使i的值超过列表,此时的索引本应该是指向后一位,但由于列表已经结束,在约瑟夫环中则会回到开头的猴子,相当于经过了一次循环。而余数正好是我们所需要的索引。
我们可以用来确定下一个猴子的索引,其中i是当前索引,m是报几只猴子,n是总量