请问这个哪里出错了?

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入样例:

11

输出样例:

7

 

num=int(input())
a=list(range(num+1))
num=a[1:]#给猴子编号,1~N
while True:
    for i in range(1,4):#从1开始数,数3次(即循环3次),然后第三只出局
        num.append(num[0])#猴子数完数就去列表的末尾
        del(num[0])#删除变量,方便下一只猴子下次使用
        if(i==2):#已经数了2只猴子,第三只猴子出局
            num.pop(0)#从列表中删除出局的猴子
    if len(num)==1:#列表中只有一只猴子了,就是大王
        break
print('猴子大王的编号为:',int(num[0]))

for i in range(1,4):#从1开始数,数3次(即循环3次),然后第三只出局

不应该range(1,3)吗?

你这样循环不行吧,应该修改a的值吧,把出局的删除。

随便写了一下,不知道对不对

def fun(n:list, m=3):
    if len(n) == 1:
        return n[0]
    else :
        if len(n) >= m:
            print(f"{n[m - 1]}号退出游戏!")
            n.remove(n[m - 1])
            n = reverse_list(n, m -1)
            print("剩余人:")
            print(n)
        else :
            num = m % len(n)
            if num:
                print(f"{n[num - 1]}号退出游戏!")
                n.remove(n[num - 1])
                n = reverse_list(n, m - 1)
                print("剩余人:")
                print(n)
            else:
                print(f"{n[-1]}号退出游戏!")
                n.remove(n[-1])
                n = reverse_list(n, m - 1)
                print("剩余人:")
                print(n)
        return fun(n)

def reverse_list(n:list, index):
    new_list =  n[index:]
    new_list.extend(n[:index])
    return new_list

number = eval(input("请输入人数:"))
li = list(range(1, number))
fun(li)
# 控制台输出结果
# 请输入人数:11
# 3号退出游戏!
# 剩余人:
# [4, 5, 6, 7, 8, 9, 10, 1, 2]
# 6号退出游戏!
# 剩余人:
# [7, 8, 9, 10, 1, 2, 4, 5]
# 9号退出游戏!
# 剩余人:
# [10, 1, 2, 4, 5, 7, 8]
# 2号退出游戏!
# 剩余人:
# [4, 5, 7, 8, 10, 1]
# 7号退出游戏!
# 剩余人:
# [8, 10, 1, 4, 5]
# 1号退出游戏!
# 剩余人:
# [4, 5, 8, 10]
# 8号退出游戏!
# 剩余人:
# [10, 4, 5]
# 5号退出游戏!
# 剩余人:
# [10, 4]
# 10号退出游戏!
# 剩余人:
# [4]
num=int(input())
a=list(range(num+1))
num=a[1:]#给猴子编号,1~N
while True:
    for i in range(1,4):#从1开始数,数3次(即循环3次),然后第三只出局

        if(i==2):#已经数了2只猴子,第三只猴子出局
            num.pop(0)#从列表中删除出局的猴子
            
        num.append(num[0])#猴子数完数就去列表的末尾
        del(num[0])#删除变量,方便下一只猴子下次使用
    if len(num)==1:#列表中只有一只猴子了,就是大王
        break
print('猴子大王的编号为:',int(num[0]))

# for 中间开始的换个顺序,出局的猴子不用加进列表

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632