阅读量:0
约瑟夫问题是一个经典的数学问题,可以使用C语言来实现。下面是一个简单的C语言实现约瑟夫问题的示例代码:
#include <stdio.h> #include <stdlib.h> // 定义循环链表的节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建循环链表 Node* createCircularLinkedList(int n) { Node* head = NULL; Node* prev = NULL; for (int i = 1; i <= n; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = i; newNode->next = NULL; if (head == NULL) { head = newNode; } else { prev->next = newNode; } prev = newNode; } prev->next = head; // 将最后一个节点的next指向头节点,形成循环 return head; } // 解决约瑟夫问题 int josephus(int n, int k) { Node* head = createCircularLinkedList(n); Node* current = head; Node* prev = NULL; // 找到要删除的节点的前一个节点 while (current->next != current) { for (int i = 1; i < k; i++) { prev = current; current = current->next; } Node* temp = current; prev->next = current->next; current = current->next; free(temp); } int result = current->data; free(current); return result; } int main() { int n = 5; // 总共有5个人 int k = 2; // 每次报数为2 int survivor = josephus(n, k); printf("Survivor: %d\n", survivor); return 0; }
在上面的代码中,首先定义了一个循环链表的节点结构体,然后实现了创建循环链表和解决约瑟夫问题的函数。在main
函数中,可以指定总共的人数n
和每次报数的数字k
,然后调用josephus
函数来计算最后幸存者的编号。最后打印出最后幸存者的编号即可。