第4章-14 猴子选大王

浙大版《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位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值