围圈报数
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
代码:
#include<iostream>
using namespace std;
int rest(int a[], int n) { //判断当前剩余多少人
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
return sum;
}
int main() {
int n, k = 0;
cin >> n; //输入人数
int *a = new int[n](); //动态创建数组,并初始化为0
while (rest(a, n) !=n-1 ) { //当数组只剩一个0时退出
for (int i = 0; i < 3; i++) { //此for循环前进3次
k = (k + 1) % n;
while (a[k] == 1) { //如果该人已退出,重新前进一次
k = (k + 1) % n;
}
}
a[k] = 1; //设为1则该人退出
}
for (int i = 0; i < n; i++) { //找到下标为0的玩家,并输出
if (a[i] == 0) {
if (i == 0) //数组下标为0,实际上保存的是第n号玩家
cout << n << endl; //所以输出的编号为第n号
else //其他下标直接即该号玩家
cout << i << endl; //所以直接输出
}
}
return 0;
}
代码中数组下标与玩家编号的对应:
因为第n号玩家模n=0, 所以数组下标为0的元素对应的是最后一号玩家。
其他x号下标正常对应x号玩家。