C++初学:围圈报数问题

问题描述:有 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的即为退出的人,剩下的即为未退出的人的原位置。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伯明翰谢老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值