详细讲解C语言经典例题:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位
如题,相信很多人都和我一样,当时看到根本不知道从何下手.那么我们先不看代码,画图来进行分析
如图,假设有10个人,他们的序号为1-10,而从1-3开始报数,报到3就退出.
这里9实际上也删除了,图没有画好
靠近尾部,那么报数将会重头开始继续报
重头开始报数,直到报到只剩下最后一个人的时候,那么这个人就是我们要找的那个了
那么大致的操作我们知道了,接下来就是思路的问题,下面是要满足的条件,或者说,要注意的事项
- 首先,得有一个排号的操作
- 再者,每一次需要在排完一遍后重复报数,直到只剩下一个人
- 其次,报数报到3后,应该要重头开始报数
- 再者,退出的人,应该要让我们知道
- 剩余的人数,要始终大于1,如果小于1,那么就不用再继续了
接下来,大致的思路也有了,那就是我们的代码如何了
原版
#include<stdio.h>
#define N 50void main()
{int group[N];int totalNum = 0, restNum = 0, count = 0, roundcount = 0; scanf_s("%d", &totalNum);//排号操作for (int i = 0; i < totalNum; i++){group[i] = i + 1;}restNum = totalNum;//只要不只剩下一个人,那么就重复报数while (restNum>1){roundcount = 0;//遍历整个数组,重复报数,直到一轮结束while (roundcount < totalNum){if (group[roundcount]!=0){count++;//报到3重头报数if (count == 3){group[roundcount] = 0;//退出的人以0为标识restNum--;count = 0;} }roundcount++;}}for (int i = 0; i < totalNum; i++){if (group[i]!=0){printf("%d", group[i]);break;}}
}
加入指针
#include<stdio.h>
#define N 50void main()
{int peopleNum[N];int totalNum = 0;//总人数int restNum = 0;//剩余人数int count = 0;//报的数scanf_s("%d", &totalNum);for (int i = 0; i < totalNum; i++){peopleNum[i] = i + 1;//赋予每个人编号}restNum = totalNum;//一开始全部人都在while (restNum>1)//只要不是剩下一个人{int* curNum = peopleNum;//每次报完一轮数,再报第二轮要重头开始while (curNum<peopleNum+totalNum)//没有报完一轮,就继续报数,让人滚蛋{if (*curNum!=0)//设0为被剔除人的标识{count++;if (count==3)//报到3的人滚蛋{*curNum = 0;//标识滚蛋的人count = 1;//从1开始重新1,2,3报数restNum--;//让一个人滚了,所以剩余的人数少一个}}curNum++;}}for (int i = 0; i < totalNum; i++){if (peopleNum[i]!=0)//只要不是滚出去的人,也就是留在场上的人,其实只会有一个{printf("The last one is %d", peopleNum[i]);break;}}
}
相信这样讲解,像我一样脑子转不过弯来的兄弟,应该也能理解的了这样一道题了
如有不足,还望指正
详细讲解C语言经典例题:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位相关推荐
- c/c++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。
解题思路的重要性显现出来了 比如这个题 n个人肯定是要用数组 毋庸置疑 那么报数怎么实现呢 可以设置一个循环变量 让他从0开始循环 当等于3 的时候 就归零 还有 n个人 肯定需要很多圈报数 这个很多 ...
- 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位. 提示:用数组完成
题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位. 提示:用数组完成 #include <stdio.h> in ...
- 有n个人,顺序排列, 并首尾相连围成一圈。从第一个人开始报数(从1到4),凡报到4的人退出圈子+扩展版本
https://blog.csdn.net/qq_44037213/article/details/106551760?fps=1&locationNum=2 有n个人(n<=1000) ...
- ACMNO.38 C语言-报数 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号. 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.`在这里插入代码片` 问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样 ...
- python n个人围成一圈,Python练习代码实例69-有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的...
Python 练习实例69 题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 程序分析:无. 程序源代码:#!/usr/bi ...
- (C语言)有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样例输入 3 样例输出 2 ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...
首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们! 然后今天群里突然有人提出了题目的这个问题: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人 ...
- 习题 6.5 有n个人围成一圈,顺序排号。从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。
C++程序设计(第三版) 谭浩强 习题6.5 个人设计 习题 6.5 有n个人围成一圈,顺序排号.从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号. 代码块: # ...
- 题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)
题目: 有 n个人围成一圈,顺序排号.从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位. 思路: 题目说是排成一圈,可以看成一个数组的排列.用i从下标为 ...
最新文章
- 我用Java+SeimiCrawler+Redis+ES+Kibana技术对数百万知乎用户进行了数据分析,得到了这些......
- 用MATLAB编程求出三位数中全部的水仙花数
- 一个端到端模型GraphDR实现多样化的召回
- 《大数据分析原理与实践》一一第3章 关联分析模型
- ASP.net控件开发系列(四)
- 利用request库请求api
- Unigam标注和Ngram标注
- Tomcat下java普通类IO文件路径问题
- 美食杂志排行榜_百度知道
- Linux编译安装iozone,Fedora下NFS的配置与iozone测试
- 利用VLMCSD部署本地KMS服务器(Windows + CentOS7)
- 计算机仿真 matlab,计算机仿真(matlab)PPT教程.ppt
- 最新!中国内地高校ESI排名出炉:342所大学上榜!
- vue项目pc端和移动端适配
- 转:: 刺鸟:用python来开发webgame服务端(5)
- 元组定义 元组运算符
- 08-【go】go语言中的*和的使用方法
- Chrome网页观看百度云视频加速
- sys.stdout.write()用法
- Qt下使用vs编译的库文件