用c语言写约瑟夫环问题
时间: 2023-06-25 07:03:53 浏览: 163
约瑟夫环问题 C语言问题
约瑟夫环问题是一个经典的数学问题,它有很多种解法,其中一种比较常见的解法是使用链表来模拟环形结构。下面是一个用 C 语言实现的例子:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createList(int n) {
Node *head = NULL, *p = NULL, *prev = NULL;
int i;
for (i = 1; i <= n; i++) {
p = (Node *) malloc(sizeof(Node));
p->data = i;
if (prev != NULL) {
prev->next = p;
} else {
head = p;
}
prev = p;
}
prev->next = head;
return head;
}
void printList(Node *head) {
Node *p = head;
do {
printf("%d ", p->data);
p = p->next;
} while (p != head);
printf("\n");
}
void josephus(int n, int m) {
Node *head = createList(n);
Node *p = head, *prev = NULL;
int i;
for (i = 1; i < m; i++) {
prev = p;
p = p->next;
}
while (n > 0) {
printf("%d ", p->data);
prev->next = p->next;
free(p);
p = prev->next;
n--;
if (n > 0) {
for (i = 1; i < m; i++) {
prev = p;
p = p->next;
}
}
}
printf("\n");
}
int main() {
josephus(7, 3);
return 0;
}
```
该程序中,`createList` 函数用于创建一个包含 `n` 个节点的循环链表,并返回链表的头节点。`printList` 函数用于打印链表中的所有元素。`josephus` 函数用于解决约瑟夫环问题,其中 `n` 表示总人数,`m` 表示每次报数的人数。程序通过遍历链表来模拟约瑟夫环,每次找到第 `m` 个人,并将其从链表中删除,直到所有人都被删除为止。
以上是一种较为简单的解法,如果需要提高程序的效率,可以使用数组来模拟循环队列或者使用数学公式来计算出最后剩下的人的编号。
阅读全文