有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
/* 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 解题思路: 1、设数组a[n],初始化数组a; 2、将数组a中的数循环赋值,赋值前需判断该位是否为0; 如何找到应该剔除的数?若n为4,则前一位是应该剔除的数,将其置为0,n重置为1,在此时将标记数++。 如何判断这是最后应该剔除的数?若标记数为N,则表明这是最后一次剔除,输出即可。 */ #include<stdio.h> #include<math.h> #include<malloc.h> #include<string.h> #define N 8 main() { int i,k,a[N],n; for(i=0;i<N;i++){ a[i]=i+1; } i=0; n=1; k=0; while(n<=3){ i=i%N; if(a[i]!=0){ a[i]=n; n++; } i++; if(n==4){ a[i-1]=0; k++; n=1; } if(k==N){ printf("%d\n",i); break; } } }