/*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;
}
while循环里面逻辑就不对
而且你自己都说是3的倍数才退出
你判断它等于-1是为什么
if (num[i]!=- 1) {
k++;
}
你对数组里面你输入的值没操作
反而是数组后面的没初始化的值
i在while循环之前没有归零,一进while就已经越界了
你不如改成
for (i = 1; m<N+1; i++)
这样防止忘记初始化,也防止忘记i++