好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。题目输入包括若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码,报数密码可能为1,题目要求按出队列顺序输出C语言
时间: 2024-03-15 09:45:21 浏览: 90
好的,这是一个经典的约瑟夫问题。我来为你写一个C语言程序解决这个问题:
```c
#include <stdio.h>
#include <stdlib.h>
int* josephus(int m, int n, int* returnSize) {
if (m < 1 || n < 1) {
*returnSize = 0;
return NULL;
}
// 初始化队列
int* queue = (int*)malloc(m * sizeof(int));
for (int i = 0; i < m; i++) {
queue[i] = i + 1;
}
int* res = (int*)malloc(m * sizeof(int));
int k = 0;
// 模拟游戏过程
int i = 0;
while (m > 0) {
i = (i + n - 1) % m;
res[k++] = queue[i];
for (int j = i; j < m - 1; j++) {
queue[j] = queue[j+1];
}
m--;
}
*returnSize = k;
return res;
}
int main() {
int m = 7;
int n = 3;
int returnSize;
int* res = josephus(m, n, &returnSize);
for (int i = 0; i < returnSize; i++) {
printf("%d ", res[i]);
}
printf("\n");
free(res);
return 0;
}
```
这个程序可以解决玩一次游戏的情况,如果需要玩多次游戏,可以在主程序中多次调用`josephus`函数即可。注意需要在使用完动态分配的内存后进行释放。
阅读全文