【学习笔记】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.
推荐阅读
-
【学习笔记】C语言习题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
-
小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
-
约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
-
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位
-
每日一题· 有10个队员围成一圈,顺序排号,从第一个开始报数(从1到3报数), 凡报到3的人退出圈子,编程实现最后留下的是原来第几号队员?
-
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位(指针方法处理)。
-
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(*)
-
n个小孩围成一圈,顺序报号,从第一个人开始报数(从1报到5),凡是报到5的人退出圈子,问最后留下的小孩原来是几号
-
【学习笔记】C语言习题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
-
小练习题(69)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位