PTA基础编程题目集 之 Python解法(7-28)

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)

发布了47 篇原创文章 · 获赞 2 · 访问量 1033

猜你喜欢

转载自blog.csdn.net/Weary_PJ/article/details/104014059