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