【學習筆記】C語言習題:有n我的圍成一圈,順序排號。從第一我的開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。

大一初學指針第一天,作一下課後習題。(《C程序設計 第五版》 譚浩強 第八章第5題)數組

具體題目如標題所示,我首先想到用數組表示n我的,首先將前n位初始化爲1,循環報數退出第3位,退出的用0表示,只剩最後一我的時輸出他的位數。spa

在循環中,有這幾點須要考慮:設計

1. 數到第三位時,將0賦給指針指向的數組元素。指針

2. 指針應跳過0。code

3. 指針指向最後一位後應重置到首位前。blog

因而有代碼以下:io

 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.ast

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息
相關文章