原题链接:[编程入门]报数问题
解题思路:
首先定义一个数组arr用来保存每个人的编号,然后再定义指针p指向数组arr,变量n保存的是人的个数,将n的值赋值给m。
所有变量定义好之后使用for循环给每个人编号,代码如下:
for(i=0;i<n;i++) { *(p+i)=i+1; }
然后报数开始,用while循环来实现,报到3的人退出,在代码中令其原来的编号变为0代表其已经退出,直至为最后一个人时退出循环,此部分代码如下:
while(m>1) { //每个人开始报数 if(*(p+i)!=0) { k++; } //报数为3的进行处理 if(k==3) { *(p+i)=0; k=0; m--; } //每判断一个人后i++转向下一个人 i++; //当i的值和输入人数相等时将i重新置零从头开始报数 if(i==n) { i=0; } }
当while循环退出时,说明只剩下一个人,也就是说只有一个人的编号没有被置为0,所以为了找出此人,还需要对所有的人进行一次遍历,判断其编号是否为了,如果不是,则此人便是想要的结果,此段代码如下:
for(i=0;i<n;i++) { if(*(p+i)!=0) { cout<<*(p+i); } }
本题完整的参考代码:
#include<iostream> using namespace std; int main() { int arr[100]; int n; int *p; int i; int m; int k=0; //让指针指向数组arr p=arr; cin>>n; m=n; //给每个人编号 for(i=0;i<n;i++) { *(p+i)=i+1; } i=0; //在while循环中找出最后留下的那个人 while(m>1) { //每个人开始报数 if(*(p+i)!=0) { k++; } //报数为3的进行处理 if(k==3) { *(p+i)=0; k=0; m--; } //每判断一个人后i++转向下一个人 i++; //当i的值和输入人数相等时将i重新置零从头开始报数 if(i==n) { i=0; } } //用for循环找到那个人并输出 for(i=0;i<n;i++) { if(*(p+i)!=0) { cout<<*(p+i); } } return 0; }
0.0分
15 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复