以下是使用 C 语言实现约瑟夫环问题的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int number;
    struct Node* next;
} Node;

Node* createCircularLinkedList(int n) {
    Node* head = (Node*)malloc(sizeof(Node));
    Node* current = head;

    for (int i = 1; i <= n; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->number = i;
        newNode->next = NULL;

        current->next = newNode;
        current = current->next;
    }

    current->next = head->next; // make it circular

    free(head);
    return current->next;
}

Node* eliminate(Node* head, int m) {
    Node* current = head;
    Node* prev = NULL;

    while (current->next != current) {
        for (int i = 1; i < m; i++) {
            prev = current;
            current = current->next;
        }

        prev->next = current->next;
        Node* temp = current;
        current = current->next;
        free(temp);
    }

    return current;
}

int main() {
    int n, m;
    printf("Enter the number of people: ");
    scanf("%d", &n);
    printf("Enter the value of m: ");
    scanf("%d", &m);

    Node* head = createCircularLinkedList(n);
    Node* survivor = eliminate(head, m);

    printf("The last two survivors are: %d and %d\n", survivor->number, survivor->next->number);

    return 0;
}

在这个代码中,我们先创建一个包含 n 个节点的单向循环链表,每个节点的值分别为 1 到 n。然后,我们按照约瑟夫环的规则,依次淘汰节点,直到只剩下最后一个节点为止。最后,我们输出最后两个幸存者的编号。

请注意,此代码假设输入的 n 大于等于 2,并且 m 大于等于 1。对于其他情况,可能需要进行额外的输入验证和错误处理。

约瑟夫环问题 C语言实现:求最后两个幸存者

原文地址: https://www.cveoy.top/t/topic/qlaU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录