C语言数组编写代码约瑟夫生者死者小游戏30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
时间: 2024-03-22 12:42:03 浏览: 18
好的,使用数组来解决这个问题也是可行的。下面是使用C语言编写的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
int *josephus(int n, int m, int k) {
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
int *res = (int *)malloc(k * sizeof(int));
int count = 0;
int start = 0;
while (count < k) {
int index = (start + m - 1) % n;
res[count++] = arr[index];
for (int i = index; i < n - 1; i++) {
arr[i] = arr[i + 1];
}
n--;
start = index;
}
free(arr);
return res;
}
int main() {
int n = 30; // 总人数
int m = 9; // 报到9的人下船
int k = 15; // 最后只剩15人
int *res = josephus(n, m, k);
printf("下船的人的编号为:");
for (int i = 0; i < k; i++) {
printf("%d ", res[i]);
}
printf("\n");
free(res);
return 0;
}
```
上面的代码中,我们首先创建一个包含所有人编号的数组,然后模拟约瑟夫过程,每次从数组中删除第m个人,直到只剩下15个人为止,最后输出下船的人的编号。和使用链表的方法相比,使用数组的方法更加简单,但是需要频繁地进行数组元素的移动操作。