c/c++语言开发共享【学习笔记】C语言习题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

大一初学指针第一天,做一下课后习题。(《C程序设计 第五版》 谭浩强 第八章第5题) 具体题目如标题所示,我首先想到用数组表示n个人,首先将前n位初始化为1,循环报数退出第3位,退出的用0表示,只剩最后一个人时输出他的位数。 在循环中,有这几点需要考虑: 1. 数到第三位时,将0赋给指针指向的数组元 …

大一初学指针第一天,做一下课后习题。(《c程序设计 第五版》 谭浩强 第八章第5题)

具体题目如标题所示,我首先想到用数组表示n个人,首先将前n位初始化为1,循环报数退出第3位,退出的用0表示,只剩最后一个人时输出他的位数。

在循环中,有这几点需要考虑:

1. 数到第三位时,将0赋给指针指向的数组元素。

2. 指针应跳过0。

3. 指针指向最后一位后应重置到首位前。

于是有代码如下:

 1 #include <stdio.h>  2 #include <stdlib.h>  3 #define size 1024 //最大判断人数  4 int main(){  5     int numberlast,peoplenum,peopleexist[size]={0},i;  6     int * firstptr, * moveptr; //firstptr指向判断数组peopleexist的首位  7   8     puts("enter the number of people.");  9     scanf("%d",&peoplenum); 10  11     moveptr=firstptr=peopleexist; 12     numberlast=peoplenum; 13     //人员存在判断初始化 14     for(i=0;i<peoplenum;i++,moveptr++){ 15         *moveptr=1; 16     } 17  18     moveptr=firstptr; 19  20     while(1){ 21         for(i=1;i<=3;i++,moveptr++){ 22             if(!(*moveptr)){ 23                 i--; //跳过0 24                 if(moveptr==firstptr+peoplenum-1) moveptr=firstptr-1; //moveptr指向数组最后一位时重置moveptr,下同 25                 continue; 26             } 27             if(i==3&&*moveptr){//第三位离开 28                 *moveptr=0; 29                 numberlast--; 30             } 31             if(moveptr==firstptr+peoplenum-1) moveptr=firstptr-1; 32         } 33         if(numberlast==1) break;//只剩最后一人时跳出循环 34     } 35  36     //循环找出最后一人 37     moveptr=firstptr; 38     while(1){ 39         if(*moveptr){ 40             printf("the last people is no.%d.n",moveptr-firstptr+1); 41             break; 42         } 43         moveptr++; 44     } 45  46     system("pause"); 47     return 0; 48 }

编译运行,结果如下:

enter the number of people.
5
the last people is no.4.

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/599658.html

(0)
上一篇 2021年5月9日
下一篇 2021年5月9日

精彩推荐