【python】第4章-18 猴子选大王[10行]

文章描述了一种模拟现实中的猴王选举过程,通过报数并淘汰每轮报到3的猴子,最终剩下的猴子成为猴王。算法通过编程实现,输入猴子总数N,输出最后的猴王编号。
摘要由CSDN通过智能技术生成

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

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7
n,i=int(input()),0
a=list(range(1,n+1))
while(1):
    i+=2
    while i>len(a)-1:
        i=i-len(a)
    if len(a)==1:
        print(a[0])
        break
    a.pop(i)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
解题思路: 该问题可以使用数组或链表两种方式求解,因为求解过程中需要频繁地从数据结构中删除元素,所以链表方式会更加方便一些。具体思路如下: 1. 读入猴子数量m、数到第n只猴子时离开圈的数值n。 2. 创建一个链表,表示初始时所有的猴子围成一圈,每个节点包含该猴子的编号和指向下一个猴子的指针。 3. 按照题目要求模拟猴子王的过程,遍历链表删除该离开圈的猴子节点,直到链表中只剩下最后一只猴子。 4. 输出最后一只猴子的编号,即为大王的编号。 代码实现: 链表方式: ```python class Node: def __init__(self, number, next=None): self.number = number self.next = next def monkey_king(m, n): # 构造循环链表 head = Node(1) p = head for i in range(2, m+1): p.next = Node(i) p = p.next p.next = head # 模拟猴子王的过程 p = head while p.next != p: # 找到第n-1只猴子 for i in range(n-1): p = p.next # 删除第n只猴子 q = p.next p.next = q.next del q return p.number m = int(input('请输入猴子数量m:')) n = int(input('请输入数到第n只猴子时离开圈的数值n:')) print('大王的编号是:', monkey_king(m, n)) ``` 数组方式: ```python def monkey_king(m, n): monkeys = [i+1 for i in range(m)] # 构造初始猴子数组 i = 0 # 当前手的下标 while len(monkeys) > 1: i = (i + n - 1) % len(monkeys) # 找到需要删除的猴子的下标 monkeys.pop(i) # 删除该猴子 return monkeys[0] m = int(input('请输入猴子数量m:')) n = int(input('请输入数到第n只猴子时离开圈的数值n:')) print('大王的编号是:', monkey_king(m, n)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在清春的浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值