报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );
其中n
是初始人数;m
是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff
将每个人的退出顺序编号存在数组out[]
中。因为C语言数组下标是从0开始的,所以第i
个位置上的人是第out[i-1]
个退出的。
裁判测试程序样例:
#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;
}
/* 你的代码将被嵌在这里 */
输入样例:
11 3
输出样例:
4 10 1 7 5 2 11 9 3 6 8
补充代码:
void CountOff( int n, int m, int out[] )
{
int number[MAXN];//储存选手的编号
int p, count = 0, i = 0, f = 0; //此处p用来指向参赛选手,i表示游戏进行轮数,count是报数器,f是退出的次序
for (p = 0; p < n; p++) {
number[p] = p + 1;
}
p = 0; //在编号储存好后,p归零
while (i < n) {
if (number[p] != -1) //若指向选手并未退出,则报数器进行计数
count++;
if (count == m) { //报数器报到m时,进入退出环节
f++;
out[p] = f; //第p+1号选手退出
number[p] = -1; //名单中将已退出的选手划掉
count = 0; //报数器重新开始计数
i++;//一轮游戏结束
}
p++;//指向下一位选手
if (p == n) //刚好报完一圈,则重新开始指向选手
p = 0;
}
}