balaaaala 2022-11-03 13:22 采纳率: 100%
浏览 45
已结题

有n个人围成一圈报数问题

问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
为什么我这个代码运行不出结果呀?

#include<iostream>
using namespace std;
int  main()
{
    int n;//最开始的总人数 
    int i;//控制变量 
    cout<<"请输入有多少人参加游戏"<<'\n';
    cin>>n; 
    int s[100];//定义一个数组 
    int j=0;//总共退圈人数 
    int y;// 每轮退圈人的号码 
    int cout=0;//每轮报号累加数 
    for(i=0;i<n;i++)
    {
        s[i]=1;//1在圈内,0在圈外,所有人都在圈外时停止循环 
    }
    while(j<n)
    {
        for(i=0;i<n;i++)
        {
            if(s[i]==1)
            {
                cout++;
                if(cout%3==0)
                {
                    s[i]=0;
                    j++;
                    y=i+1;
                }
            }
        }
    }
    cout<<y<<'\n';
            return 0;
} 

  • 写回答

3条回答 默认 最新

  • JarodYv 人工智能领域新星创作者 2022-11-03 14:04
    关注

    我实在没理解的逻辑。我写了一个,带有详细注释,供您参考。如果有用望采纳。

    #include <stdio.h>
    
    int main() {
        int m, n;
        scanf("%d %d", &n, &m); // n人数,m是报数
    
        if (m <= 0 || n <= 0) {
            printf("输入数据不合法\n");
            return -1;
        }
        int a[n + 1];
        for (int i = 1; i < n; i++)
            a[i] = i + 1;
        a[n] = 1;
        int pos = 1;                    // 表示最先从编号为1的人开始数,pos表示当前数到的人的序号
        int cnt = 1;                     // 表示当前数到第几个,因为第一个已数过,故cnt=1
        while (a[pos] != pos) {   // a[pos]!=pos 说明下一个不是自己本身,即人数>=2个,游戏继续
            cnt++;                        // 数的人加1,即将序号为a[pos]的人已经数过
            if (cnt == m) {             // 当cnt=n时,说明该人要出圈
                a[pos] = a[a[pos]]; //pos位的直接后继(a[pos]) 改为 a[pos]位的直接后继(a[a[pos]])
                pos = a[pos];         //继续向后数,当前数到的是序号为更新后的a[pos]的,cnt计数为1
                cnt = 1;
            } else {
                pos = a[pos]; //如何不是第n个,继续往后数,将pos向后移动
            }
        }
        printf("最终留下%d号\n", pos);
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 11月3日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。