问题描述:有 50 个人,围坐成一圈,然后开始报数,从 0 开始报数,报数是从 0-7,报到 7 的人,退出这个圈子,然后下一人开始从 0 报,问报数 15 轮后,哪些人会留下来,原来他所在的位置。把留下来的人输出原本他所在的位置。
Cpp文件:main.cpp
思路:对于转圈圈问题,利用指针是个不错的选择。
利用数组存放这50个人,数组名是这个数组的首地址,利用*(a+i)的方式解引用,
这样指针始终指向第一个人,通过对i的循环,实现转圈圈。
在转圈的时候,设置一个计数器,让他跟随转圈的人从0到7循环,
每数到7就将此人标记为0(或其他标记),再加个判断,
在下次计数时先判断此人是否已经标记为0,若是,则跳过他计数。
不要忘了,计数器每数到7,就表示有一个人报到了7,他应该退出这个圈子,
所以最外层应设置一个while,判断是否已经有15个人报到了7,
若是,则停止报数,此时标记为0的人,即为退出的人。
#include <iostream>
#define N 50
#define n 15
using namespace std;
void start(int a[N]);//初始化人数
void output(int a[N]);//开始转圈
void circle(int a[N]);//输出结果
int main()
{
int a[N] = { 0 };
start(a);
circle(a);
output(a);
system("pause");
return 0;
}
void start(int a[N]) {
for (int i = 0; i < N; ++i) {
a[i] = i + 1;
}
}
void output(int a[N]) {
for (int i = 0; i < N; ++i) {
cout << a[i] << " ";
}
}
void circle(int a[N]) {
int cnt = n;
int t = -1;
while (cnt > 0) {
for (int i = 0; i < N; ++i) {
if ((*(a + i)) != 0) t++; //排除已经标为0的人 继续下一次计数
if (t == 7 && cnt > 0) { //计数,cnt>0:排除已到15圈但是还在循环的情况
*(a + i) = 0; //数到7的人标为0
cnt--; //圈数-1
t = -1; //重置计数
}
}
}
}
运行结果
上述标为0的即为退出的人,剩下的即为未退出的人的原位置。