#include <stdio.h>
void solveJosephusProblemWithArray(int n, int m)
{
int people[n];
for (int i = 0; i < n; i++)
{
people[i] = i + 1;
}
int current = 0;
int count = 0;
while (count < n - 1)
{
if (n == 0)
{
printf("无法继续进行约瑟夫环。\n");
return;
}
for (int i = 0; i < m - 1; i++)
{
current = (current + 1) % n;
}
printf("出列的人是:%d\n", people[current]);
people[current] = 0;
count++;
current = (current + 1) % n;
}
printf("最后剩下的人是:%d\n", people[current]);
}
int main()
{
int n = 5;
int m = 2;
solveJosephusProblemWithArray(n, m);
return 0;
}
链表法
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void solveJosephusProblemWithCircularLinkedList(struct Node *head, int n, int m)
{
struct Node *current = head;
int count = 0;
while (count < n - 1)
{
if (head == NULL)
{
printf("无法继续进行约瑟夫环。\n");
return;
}
for (int i = 0; i < m - 1; i++)
{
current = current->next;
}
struct Node *toDelete = current;
current = current->next;
free(toDelete);
count++;
if (current == head)
{
head = current->next;
}
}
printf("最后剩下的人是:%d\n", current->data);
}
int main()
{
struct Node *head = NULL;
struct Node *current = NULL;
for (int i = 1; i <= 5; i++)
{
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->data = i;
newNode->next = NULL;
if (head == NULL)
{
head = newNode;
current = newNode;
}
else
{
current->next = newNode;
current = newNode;
}
}
current->next = head;
int m = 2;
solveJosephusProblemWithCircularLinkedList(head, 5, m);
return 0;
}