1. 程式人生 > >指標習題5 (有點意思的題目)

指標習題5 (有點意思的題目)

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(答案版)