joseph环用c语言实现
时间: 2023-10-16 07:07:34 浏览: 106
Josephus 环(又称约瑟夫环)是一个经典的数学问题,其问题描述如下:
有 n 个人围成一圈,从第一个人开始报数,数到 m 的人出圈,剩下的人继续从 1 开始报数,数到 m 的人又出圈,直到所有人都出圈为止。问最后留下的人是原来的第几个人?
下面是使用 C 语言实现 Josephus 环的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int id;
struct Node* next;
} Node;
int main() {
int n, m;
printf("请输入总人数 n 和报数 m:");
scanf("%d%d", &n, &m);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
Node* cur = head;
for (int i = 1; i <= n; i++) {
cur->id = i;
if (i == n) {
cur->next = head;
} else {
cur->next = (Node*)malloc(sizeof(Node));
cur = cur->next;
}
}
// 开始报数出圈
int count = 1;
cur = head;
Node* prev = NULL;
while (cur->next != cur) {
if (count == m) {
printf("%d 出圈\n", cur->id);
prev->next = cur->next;
Node* tmp = cur;
cur = cur->next;
free(tmp);
count = 1;
} else {
prev = cur;
cur = cur->next;
count++;
}
}
// 输出最后留下的人
printf("剩下的人是第 %d 个人\n", cur->id);
// 释放链表内存
free(cur);
return 0;
}
```
上述代码中,我们使用了循环链表来模拟 Josephus 环,通过报数出圈的操作来模拟人数逐渐减少的过程,最后输出剩下的人的编号即可。
阅读全文