cc++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。

cc++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。,第1张

c/c++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。

解题思路的重要性显现出来了 比如这个题 n个人肯定是要用数组 毋庸置疑 那么报数怎么实现呢 可以设置一个循环变量 让他从0开始循环 当等于3 的时候 就归零

还有 n个人 肯定需要很多圈报数 这个很多圈怎么实现 也是个问题 这些都是算法的相关问题

突然还有一个很感慨的事情 虽然高数课很久没上了 但是之前高数老师说的一句让我感受颇多 就是数学需要归纳总结 理解 我觉得这个对于很多科目都适用 不仅高数 c也可以 甚至是文科 比如这里需要循环很多圈 以后的另一个问题可能也会面临这个困难 怎么循环很多圈 还有就是报数怎么实现 都需要归纳总结 多思考

代码
int main()
{
	cout << "一共有多少个人:?" << endl;
	int n = 0;
	cin >> n;
	int num[50];
	int* p = num;
	for (int i = 0; i < n; i++)
	{
		*(p + i) = i + 1;    //第几个人的编号就是几  从一开始
	}
	int i = 0;  //用于总循环的变量
	
	int k = 0;  //k是按123报数时的计数变量   一个循环变量  在循环体中让这个数字变化 当变到3的时候就进行某些操作

	int m = 0;  //m是退出的人数  当m等于n-1时 结束  否则不知道什么时候推出
	
	while (m < n - 1)    //当m等于n-1时 就结束
	{
		if (*(p + i) != 0) k++;  //如果这个人不是0 就是有效成员 k就加一 如果是0 那么就k就不变 下面的if语句就不会受到影响
		if (k == 3)
		{
			*(p + i) = 0;   //报到3的人调为0  
			k = 0;          //从0开始重新报
			m++;            //退出人数加一
		}
		i++;
		if (i == n) i = 0;  //i=n-1的时候 是最后一个人  还不能调为0  当等于n 已越界 所以调为0重新循环
	}
	// 退出while循环时 已经只剩一个人不是0了
	while (*p == 0)  p++;   //直到不是0的那个人
	cout << "最后剩下的那个人是第" << *p << "个人" << endl;  //每个人的序号就是它的内容
	return 0;
}

不得不感叹这个程序的巧妙性  这个并不是我写出来的

首先 怎么把报到三的人踢出去呢?  这里的方法是把每个人都赋值一个数字  如果循环到3  就把对应的人改为0  然后踢出去的人数也加一  

什么时候终止循环呢?  说实话我在看答案之前想过这个问题   这里的做法是统计踢出去的人数 当踢出去的人数到达总人数减一时 就终止  这个也很妙

这里的i变量  从0到n-1  一遍一遍地遍历 直到只剩下一个人为止

那么有没有其他方法呢  试想 如果以每个成员的内容为判断依据 如果它是3的倍数  那么第一遍的时候肯定就是报到3了  就把他变为0? 可是第二圈呢? 这里又不好处理了 其实也可以有别的办法 第二圈的时候可以把统计上一圈踢出去的人 把数组长度减小 但是那个剩下的人原来是几也不好计数了  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存