猴子选大王问题(要从n只猴子中选出一位大王。它们决定使用下面的方法: n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始)

【问题描述】要从n只猴子中选出一位大王。它们决定使用下面的方法:
n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。
【输入形式】控制台输入三个整数n,m,q。
【输出形式】输出最后选为大王的猴子编号。
【样例输入】
7 4 3
【样例输出】
4
【样例说明】输入整数n = 7,m = 4,q = 3,输出4

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
    int n,m,q,i,out,num=0;
    scanf("%d %d %d",&n,&m,&q);
    int s[n];
    out=0;//记录已被淘汰的猴子
    memset(s,0,sizeof s);//如果用循环一个个赋值,程序运行时间过长
    for(i=q-1;out<n;i++)
    {
        if(i==n)
            i=0;
        if(!s[i])
        {
            num++;//记录每轮已报数的猴子
            if(num==m)
            {
                num=0;
                out++;
                s[i]=1;
                if(out==n)
                {
                    printf("%d",i+1);
                }
            }
        }
    }
    return 0;
}
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
然后,从第一个猴子开始报数,每次报到n的猴子出列,剩下的猴子继续按顺序报数。如此循环,直到只剩下一只猴子为止,该猴子即为大王。 首先我们需要明确几个变量的含义:猴子的总数为m,每次报数到第n只猴子出列,最后剩下的那只猴子编号为x。 我们可以使用循环来模拟猴子选大王的过程。首先创建一个长度为m的数组,用来存放猴子编号。然后从第一个猴子开始报数,每次报数到第n只猴子,就将该猴子编号从数组移除。重复这个过程,直到数组只剩下一只猴子。最后剩下的那只猴子编号即为x。 具体的实现步骤如下: 1. 创建一个长度为m的数组,保存猴子编号编号范围为0到m-1。 2. 初始化报数的位置为0,即从数组的第一个元素开始报数。 3. 使用一个循环,每轮循环从当前位置开始报数报数到第n只猴子,移除该猴子编号。 4. 更新当前位置,使其指向下一个猴子。 5. 当数组只剩下一个元素时,循环结束,该元素即为大王编号x。 6. 返回大王编号x。 例如,当猴子总数m为5,报数的位置n为3时: 1. 创建数组[0, 1, 2, 3, 4]。 2. 从0位置开始报数报数到第3只猴子,移除编号为2的猴子。 3. 数组变为[0, 1, 3, 4],当前位置更新为3。 4. 从3位置开始报数报数到第3只猴子,移除编号为4的猴子。 5. 数组变为[0, 1, 3],当前位置更新为0。 6. 从0位置开始报数报数到第3只猴子,移除编号为0的猴子。 7. 数组变为[1, 3],当前位置更新为1。 8. 从1位置开始报数报数到第3只猴子,移除编号为3的猴子。 9. 数组变为[1],当前位置更新为0。 10. 数组只剩下一个元素,循环结束,大王编号为1。 因此,当猴子总数m为5,报数位置n为3时,选出大王编号为1。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值