约瑟夫环: 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,直到只剩一人,问最后留下的是原来第几号的那位。n<100用c语言
时间: 2024-09-10 10:28:32 浏览: 62
约瑟夫环问题(Josephus Problem)是一个著名的理论问题,涉及数学和计算机科学中的算法设计。在C语言中实现约瑟夫环问题的算法,通常会使用到循环链表的数据结构来模拟这个过程。
下面是一个简单的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
struct Node *next;
} Node;
Node* createCircle(int n) {
Node *head = NULL, *pre = NULL, *temp = NULL;
for (int i = 1; i <= n; i++) {
temp = (Node*)malloc(sizeof(Node));
temp->number = i;
if (i == 1) {
head = temp;
} else {
pre->next = temp;
}
pre = temp;
}
pre->next = head; // 形成环状链表
return head;
}
int josephus(int n) {
Node *head = createCircle(n);
Node *cur = head;
Node *pre = NULL;
while (cur->next != cur) { // 当链表中只剩下一个节点时停止循环
for (int i = 1; i < 3; i++) { // 报数1, 2
pre = cur;
cur = cur->next;
}
// 报到3,删除当前节点
pre->next = cur->next;
printf("出列的人编号:%d\n", cur->number);
free(cur);
cur = pre->next;
}
int lastNumber = cur->number;
free(cur);
return lastNumber;
}
int main() {
int n;
printf("请输入总人数n:");
scanf("%d", &n);
int lastPerson = josephus(n);
printf("最后留下的是原来第%d号的那位。\n", lastPerson);
return 0;
}
```
在这个示例中,我们首先创建了一个循环链表来表示围成一圈的人。每个人被赋予一个编号,从1开始到n结束。然后,我们模拟报数过程,每数到3就将当前人从圈中移除,直到只剩下一个为止。最后输出剩下的人的原始编号。
阅读全文