17个人围成圈,编号为1—17,从第1号开始报数, 报到3的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号

17个人围成圈,编号为1—17,从第1号开始报数, 报到3的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号
/*17个人围成圈,编号为1—17,从第1号开始报数,
报到3的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号。*/
#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;  
    //用循环对数组赋初值,为符合日常,舍弃下标为0,从1开始计数
    for (i = 1; i < N+1; 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 1; i++) {
        if (num[i] != -1) {
            cout << num[i] << " ";
        }
    }


    system("pause");
    return 0;
}

img

while循环里面逻辑就不对
而且你自己都说是3的倍数才退出

你判断它等于-1是为什么

if (num[i]!=- 1) {
            k++;
        }

你对数组里面你输入的值没操作
反而是数组后面的没初始化的值

i在while循环之前没有归零,一进while就已经越界了
你不如改成
for (i = 1; m<N+1; i++)
这样防止忘记初始化,也防止忘记i++