指標習題5 (有點意思的題目)
阿新 • • 發佈:2018-12-14
5.有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報道3的人退出圈子,問最後留下的是原來第幾號的那位。
不說了,說多了都是淚,這道題樓主搞了四個多小時。。。但是做出來時還是很興奮地
上正題了,本題要注意的是n個人圍成一圈
#include<stdio.h> int main() {int n,i,j,k=1,m=0,x=1,y=0; printf("please intput n:"); scanf("%d",&n); int a[n+1]; int *p[n+1]; for(i=1;i<n+1;i++)//給指標陣列初始化 {a[i]=i; p[i]=&a[i]; } while(m!=1) //迴圈淘汰,直至只剩一人時跳出迴圈 {m=0; for(i=x,j=k;(i<n+1)&&(j<4);x++,i++)//讓指標數組裡的元素指向1,2,3 {if(*p[i]!=0) //x為了保留i的值,k是為了保留j的值 {*p[i]=j; k++; j++;} } if(x>=n+1)//如果已經迴圈一遍了,另x為1,下次又會重新賦值 {x=1;} for(i=1;i<n+1;i++)//淘汰報3的人,(令報3的人的值指標指向NULL) {if(*p[i]==3) {*p[i]=NULL;} } for(i=1;i<n+1;i++)//檢測還有多少人沒被淘汰 {if(*p[i]!=0) {m++; } } if(k>3) //如果k的值大於三,也就是報數報完三了,就令k=1,從新開始報數 {k=1;} } for(i=1;i<n+1;i++)//輸出那個不指向NULL的指標的序號 ,即是最後剩下的那個人的最初序號 {if(*p[i]!=0) {k=i; break; } } printf("the last one:%d\n",k); return 0; }
執行結果
n=2 時為2
n=3時為2
n=4時為1
n=7時為4
n=8時為7
思路:用每一個指標陣列的名字代表每個人,例如p[1]就是第一個人,p[2]就是第二個人,以此類推,
注意,要對指標陣列進行初始化,
本題較為複雜,希望讀者先自己思考嘗試,有問題,最好多進行除錯,嘗試自己找出問題。
下一篇,將會放上答案的方法 指標習題5(答案版)