报数 分数 20 全屏浏览题目 切换布局 作者 徐镜春 单位 浙江大学 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。 本题要求编写函数,给出每个人的退出顺序编号。 函数接口定义: void CountOff( int n, int m, int out[] );c语言
时间: 2024-03-25 15:40:34 浏览: 122
题目描述:
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff(int n, int m, int out[]);
其中n是总人数,m是报到m的人退出,out数组返回退出顺序编号。
输入样例:
6 3
输出样例:
3 6 4 2 5 1
题目思路:
1.使用数组记录每个人的状态,1表示未出圈,0表示已经出圈。
2.使用while循环对每一个人进行报数,当数到m的时候,将这个人的状态变为0,并且将这个人的编号加入到输出列表中。
3.使用一个变量count记录出圈人数,当count等于n时结束循环,输出列表即为出圈顺序编号。
代码实现:
```c
void CountOff(int n, int m, int out[]) {
int i, j, count = 0, index = 0, left = n;
int *status = (int *)malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
status[i] = 1;
}
i = 0;
while (count < n) {
if (status[i] == 1) {
index++;
if (index == m) {
out[count++] = i + 1;
status[i] = 0;
left--;
index = 0;
}
}
i++;
if (i == n) i = 0;
}
free(status);
}
```
阅读全文