椰Ye 2022-11-28 21:38 采纳率: 63.2%
浏览 153
已结题

17个人围成圈,编号为1—17,从第1号开始报数, 报到3的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号(标签-c++|关键词-stream)

c++学到数组啦,围圈报3的倍数,写不明白
/*c。*/
#include<iostream>
using namespace std;
int main() {
    int N = 0; 
    cout << "请输入围成圈的人数" << endl;
    cin >> N;
    int num[100];  //存储参加游戏人数的数组
    int m = 0;  //m为退出人数
    int k = 0;  //k为报数计数
    int i = 1;  
    int j = 0;//i为圆圈进行游戏里的人的计数
    //用循环对数组赋初值
    for (i = 1; i <= N; i++) {
        num[i] = i;
    }
    while( m < N-1 ) {
        if (num[i]!=- 1) {
            k++;
        }
        //报到3则出局,游戏重新开始计数
        if (k == 3) {
            num[i] = -1;
            m++;
            k = 0;
        }
        i++;
        if (i = N + 1) {
            i = 1;//到圈末端就从头重新开始报数
        }
    }
    //找出剩下的那个人
    for (int i = 1; i <= N; i++) {
        if (num[i] != -1) {
            cout << num[i];
        }
    }


    system("pause");
    return 0;
}

运行的时候输入N之后就停住了,不再向下运行了啊,也没有按任意键继续的提示出现,只能手动关掉界面,为什么程序不能进行运行了?是算法哪里出错了吗,希望帮忙修改运行!
  • 写回答

1条回答 默认 最新

  • a5156520 2022-11-29 11:00
    关注

    卡住的原因应该是因为while最后一个if的判断那里,i=N+1这个应该是判断变成了赋值,然后导致程序后续计算错误而死循环了。

    不能计算出正确结果具体是因为如下两方面的原因:

    一是因为初始访问数组的下标变量i没有初始化为0,即不是从数组第一个元素开始判断,可以在while循环之前,让i置0,即从数组第一个元素开始判断;

    二是因为当超过数组最后一人的判断那里出错了,数组最后一人后面的下标为N,所以把判断i=N+1改为i==N, 再把里面的i=1改为i=0即可,因为数组第一个元素的下标是0,修改如下:

    /*c。*/
    #include<iostream>
    using namespace std;
    int main() {
        int N = 0; 
        cout << "请输入围成圈的人数" << endl;
        cin >> N;
        int num[100];  //存储参加游戏人数的数组
        int m = 0;  //m为退出人数
        int k = 0;  //k为报数计数
        int i = 1;  
        int j = 0;//i为圆圈进行游戏里的人的计数
        //用循环对数组赋初值
        for (i = 0; i < N; i++) {
            num[i] = i+1;
        }
        
        i=0; //初始化访问数组的下标变量为0,即初始从数组第一个位置开始判断 
        while( m < N-1 ) {
    
            
            if (num[i]!=- 1) {
                k++;
            }
    
            //报到3则出局,游戏重新开始计数
            if (k ==3) { 
                //printf("k=%d,num[%d]=%d,m=%d\n",k,i,num[i],m);
                num[i] = -1;
                m++;
                
                k = 0;
            }
            i++;
            if (i == N ) {
                i = 0;//到圈末端就从头重新开始报数
            }
            
        }
        
        
        //找出剩下的那个人
        for (int i = 0; i < N; i++) {
            if (num[i] != -1) {
                cout << num[i]<<" ";
            }
        }
        system("pause");
        return 0;
    }
    
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 创建了问题 11月28日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大