指针习题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(答案版)

猜你喜欢

转载自blog.csdn.net/weixin_43918004/article/details/84963637
今日推荐