C语言 有M个人围坐成一圈, 编号依次从1开始递增直到M,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。所有出列的人再次按出列顺序围坐成一圈,并从第1人开始报数,这次为报到K的人出队列,然后再从下一人开始重新报数,报到K的人出列;重复这一过程,直至所有人出列。求最后出列次序。题目输入包括M、N、K三个正整数;N、K可能为1。题目要求按最后出队列顺序输出他们的编号,每个测试用例结果占一行,每个编号占4位。
时间: 2024-03-13 13:43:18 浏览: 65
这是一个经典的约瑟夫问题,可以使用循环链表或者模拟法来解决。以下是使用模拟法的C语言代码实现:
```c
#include <stdio.h>
#define MAXN 10000
int a[MAXN];
int main()
{
int m, n, k;
while (scanf("%d%d%d", &m, &n, &k) == 3) {
for (int i = 0; i < m; i++)
a[i] = i + 1;
int p = 0;
for (int i = 0; i < m; i++) {
for (int j = 1; j < n; j++) {
while (a[p] == 0)
p = (p + 1) % m;
p = (p + 1) % m;
while (a[p] == 0)
p = (p + 1) % m;
}
a[p] = 0;
if (i == m - 1)
break;
while (a[p] == 0)
p = (p + 1) % m;
}
int cnt = 0;
for (int i = 0; i < m; i++) {
if (a[i] != 0)
cnt++;
}
int q = 0;
for (int i = 0; i < m; i++) {
if (a[i] != 0 && ++q == cnt)
printf("%4d\n", a[i]);
}
for (int i = 0; i < m; i++)
a[i] = i + 1;
p = -1;
for (int i = 0; i < m; i++) {
for (int j = 1; j < k; j++) {
do {
p = (p + 1) % m;
} while (a[p] == 0);
}
a[p] = 0;
if (i == m - 1)
break;
do {
p = (p + 1) % m;
} while (a[p] == 0);
}
cnt = 0;
for (int i = 0; i < m; i++) {
if (a[i] != 0)
cnt++;
}
q = 0;
for (int i = 0; i < m; i++) {
if (a[i] != 0 && ++q == cnt)
printf("%4d", a[i]);
}
printf("\n");
}
return 0;
}
```
输入格式为每行三个正整数M、N、K,输出格式为每个测试用例结果占一行,每个编号占4位。
阅读全文