当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 【学习笔记】C语言习题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

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

2020年05月01日  | 移动技术网IT编程  | 我要评论

亚卖呆,mp3歌曲免费下载,陈孝正摸郑微的胸

大一初学指针第一天,做一下课后习题。(《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.

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网