有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
先写我的思路,没有用指针的做法。如果你用的是VC,把第六行去掉。
#include<stdio.h> #include<stdlib.h> int main() { setvbuf(stdout,NULL,_IONBF,0); int n,num; //n为总人数,num为剩余人数。 int a[255]={0}; //用0标记此位置有人,若此位置的人退出,则该位置的值为1 int i; int flag=0; //flag为报数 printf("How many people?"); scanf("%d",&n); num=n; //剩余人数初始为n while(num!=1) //剩余人数为1时,停止循环 { for(i=0;i<n;i++) { if(a[i]==0) //若该位置有人,就报数 flag++; if(flag==3) //若报数为3,此人退出 { flag=0; a[i]=1; num--; } } } for(i=0;i<n;i++) //遍历数组,第一个值为0的位置处就是剩余的人了 { if(a[i]==0) { printf("The remaining person is NO.%d.",i+1); //数组的序号从0算起,而人的编号从1算起,所以有+1的修正 break; } } return EXIT_SUCCESS; }
参考答案的算法基本和我的差不多
区别有:
1 每个位置上刚开始赋值为每个人的编号1-n,有人退出后,该人的位置赋值为0;
2 把每个用数组形式表示的a[i]转换为*(p+i),p当然事先定义并赋值为p=a,不过这个区别不是很大哈。
最后一个循环可以用while来实现,很是简洁:
i=0;
while(a[i]==1)
i++;
printf("The remaining person is NO.%d.",i+1);