习题8-4 报数(20 分)
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到$m(\lt n)$的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
1
| void CountOff( int n, int m, int out[] );
|
其中n
是初始人数;m
是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff
将每个人的退出顺序编号存在数组out[]
中。因为C语言数组下标是从0开始的,所以第i
个位置上的人是第out[i-1]
个退出的。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #define MAXN 20
void CountOff( int n, int m, int out[] );
int main() { int out[MAXN], n, m; int i;
scanf("%d %d", &n, &m); CountOff( n, m, out ); for ( i = 0; i < n; i++ ) printf("%d ", out[i]); printf("\n");
return 0; }
|
输入样例:
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <stdio.h> #define MAXN 20
void CountOff( int n, int m, int out[] );
int main() { int out[MAXN], n, m; int i;
scanf("%d %d", &n, &m); CountOff( n, m, out ); for ( i = 0; i < n; i++ ) printf("%d ", out[i]); printf("\n");
return 0; }
void CountOff( int n, int m, int out[] ){ int i=0,j=0,k=0,cnt=0,a[MAXN];
for(i=0;i<n;i++) a[i] = i+1;
i=0; while(cnt < n){ if(a[i]!=0) k++; if(k==m){ j++; out[i]=j; k=0; cnt++; a[i]=0; }
i++; if(i==n) i=0; } }
|