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

c++学到数组啦,围圈报3的倍数,写不明白
/*c。*/
#include
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之后就停住了,不再向下运行了啊,也没有按任意键继续的提示出现,只能手动关掉界面,为什么程序不能进行运行了?是算法哪里出错了吗,希望帮忙修改运行!

卡住的原因应该是因为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