浙大版《Python 程序设计》题目集
第4章-14 猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
这是一个经典的约瑟夫环问题:
N=int(input())
ls=[i for i in range(1,N+1)]
step=2 #步长
ptr=1
while len(ls) > 1:
#ptr表示列表中第几个元素,没有第0个元素,只有下标为0的元素
ptr=(ptr+step-1)%len(ls)+1
del ls[ptr-1]
print(ls[0])
ptr=(ptr+step-1)%len(ls)+1 # 确定报到"3 " 的猴子的位置
ls是猴子编号, 从1~N号猴子. ptr对应的是猴子的位置, 每次从1开始数.
假设猴子数量数千万, 此时不用考虑%len(ls ). ptr=ptr+step-1+1. ptr从1开始, 即第一只猴子开始, ptr=ptr+step, 增加2就到了第一只报到3的猴子, 此时ptr=3, 对应的ls元素号就是ls[2(ptr-1)] , 删除(这只猴子)并继续报数. ptr=ptr+step=5, 因为前面淘汰了一只猴子, 所以原本编号6的猴子(在列表中)变成了第5, 删除并继续报数. ptr=ptr+step=7, 之前淘汰了2只, 原本编号9的猴子变到了第7, 删除并继续. prt=ptr+step=9, 原本编号12的猴子变到了第9,删除并继续. ptr=ptr+step=11, 原本在编号15的猴子变到了第11, 删除并继续. ptr=ptr+step=13, 原本编号18的猴子变到了13, … 每多淘汰一只, 后面的猴子的索引便向前1位