阿白| 2021-12-31 10:51 采纳率: 91.7%
浏览 60
已结题

猴子选大王,(有注解很清晰),不知道错哪了,求纠正

题目是这样的:
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。

输入
输入两个整数n和m,1<=m<=n<=100。

输出
输出猴王的编号

样例输入 Copy
8 3
样例输出 Copy
7
来源/分类
问题是测试时有一组数据答案错误:

img


//用的笨方法,若有更好思路,求指点
//这个是测试用的工程文件,于是把常用的头文件都打上了,可能有多余的
#include<stdio.h>
#include<stdlib.h>
#include <limits.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
int main()
{
    int n, m;
    int k, s, i = 1;
    scanf("%d %d", &n, &m);
    if(n == 1)//只有一个猴子,直接称王
        printf("1");
    else
    {
        int r = n;
        int number[101];
        for (int j = 0; j < 101; j++) number[j] = 1;
        while (n > 1)
        {
            s = 0;
            for (i; i < r + 1; )
            {
                if (number[i] == 0)//当前位置的猴子被淘汰了,跳过
                {
                    i %= r;
                    i++;
                    continue;
                }
                else s++;//计数=1
                if (s == m)//当数了m个数时
                {
                    number[i] = 0;//当前位置的猴子淘汰
                    i %= r;
                    i++;
                    n--;//总猴子数量-1
                    break;
                }
                i %= r;
                i++;
            }
            if (n == 1)//只剩下1个猴子时,结束
            {
                for (int t = 1; t <= r; t++)//寻找那个猴子
                {
                    if (number[t] == 1)
                    {
                        k = t;
                        break;
                    }
                }
            }
        }
        printf("%d", k);//输出
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • -Undefined_ 2021-12-31 11:42
    关注

    经典约瑟夫环问题变形

    #include<stdio.h>
    int a[105];//数组的a[i]表示第i个人是否出局,1表示出局,0表示未出局
    int main() {
        int n, m, i = 1; //i表示猴子编号,从1~n
        scanf("%d %d", &n, &m);
        int t = 0; //表示当前的猴子报的数
        int s = 0; //表示当前出局的人数
        while(s != n) {
            if(a[i] == 0) { //猴子未出局才允许报数
                t++;  //报数+1
                if(t == m) { //若猴子报数为m
                    a[i] = 1;//该猴出局,标记为1
                    s++; //出局人数+1
                    if(s == n) { //若此次出局的猴子是最后一只猴,输出
                        printf("%d ", i);
                    }
                    t = 0; //1重新开始报数
                }
            }
            i++;  //不管上一个猴出没出局,都轮到下一个猴
            if(i > n) { //若到了最后一个猴,回到第一个猴
                i = 1;
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线