用C语言编写代码解决问题:n 个人围成一圈,编号依次从1~n,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。(要求使用数组完成)
时间: 2024-03-10 14:11:20 浏览: 23
好的,下面是使用数组完成的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
void solveJosephusProblem(int n, int m) {
int* circle = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
circle[i] = i + 1;
}
int index = 0;
printf("依次出圈的人的编号:");
while (n > 0) {
index = (index + m - 1) % n;
printf("%d ", circle[index]);
for (int i = index; i < n - 1; i++) {
circle[i] = circle[i + 1];
}
n--;
}
free(circle);
}
int main() {
int n, m;
printf("请输入人数 n 和报数 m:");
scanf("%d %d", &n, &m);
solveJosephusProblem(n, m);
return 0;
}
```
在这段代码中,我们使用一个数组 `circle` 来表示围成一圈的人。首先,我们对数组进行初始化,将人的编号依次存入数组中。然后,使用一个循环进行出圈操作。每次循环中,根据当前报数的位置,找到要出圈的人,并输出其编号。然后,将数组中出圈的人后面的人依次前移,最后更新人数 `n`,直到所有人都出圈。
请注意,这里的报数位置是通过 `(index + m - 1) % n` 计算得到的,其中 `index` 表示当前报数的位置。同时,为了方便输出结果,我们使用了数组,而不是链表。