欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-27 18:49:51
大一初学指针第一天,做一下课后习题。(《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.

推荐阅读