有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- 代码如下:
#include<stdio.h>
void rest(int *p,int n);
int main()
{
int a[100],*p=a,i,n;
printf("please input n:");
scanf("%d",&n);
for(i=1;p<a+n;p++){
*p=i++;
}
rest(a,n);
for(p=a;p<a+n;p++){
if(*p){
printf("最后留下来的人为No.%d",*p);
break;
}
}
return 0;
}
void rest(int *p,int n)
{
int *first=p,i=0,k=0,count=0,rest=n;
while(rest!=1){ //当还有人剩余是进行下面操作
if(*(first+i)!=0){ //这个人还没有退出
k++; //轮流到的人数
if(k==3){
count++; //淘汰掉的人数
*(first+i)=0; //淘汰掉的人数内容标记为0
k=0; //将k重置,等到加到3的时候在淘汰人
}
}
i++;
if(i==n){
i=0;
}
rest=n-count;
}
}
- 运行结果如下: