PTA基础编程题目集 之 Python解法(7-28)
7-28 猴子选大王 (20分)
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
关于约瑟夫问题,网上有很多解法和思路,这里就写两种,具体的思路可以去搜百度
'''方法一,普通方法'''
#大致就是把题目翻译一遍,index是下标,con模拟了猴子的报数
#index在报了一圈后重置为0,代表着围成一圈报数,而淘汰的猴子将其下标改为0
N = int(input())
li = [1 for i in range(N)]
left = len(li)
con = 0
index = 0
while left != 1:
if li[index] == 1:
con += 1
if con == 3:
li[index] = 0
left -= 1
con = 0
index += 1
if index == len(li):
index = 0
for i in range(len(li)):
if li[i] == 1:
print(i + 1)
'''方法二,快捷方法'''
import sys
sys.setrecursionlimit(10000) #此行代码用于改变递归深度的值,如果不加的话递归无法达到1000次,测试点3将失败
N = int(input())
def func(n):
if n == 1:
return 0
return (func(n - 1) + 3) % n
print(func(N)+1)