酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

约瑟夫环问题是一个很经典的问题:一个圈共有n个人(n为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第n个人的编号就为n号,现在提供一个数字m,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到m这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到m的人出局,直到n个人全部出局,请问,这个出局的顺序是什么? 采用单循环链表实现,假设n为20,m为5,按出局顺序输出对应的编号。c语言实现

这是一个经典的约瑟夫环问题,可以使用链表来解决。以下是一个C语言的实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } void Josephus(int n, int m, Node* head) { Node* temp = head; while (n > 1) { for (int i = 1; i < m - 1; i++) { temp = temp->next; n--; } printf("Out: %d\n", temp->data); Node* toDelete = temp; temp = temp->next; free(toDelete); n--; } } int main() { Node* head = createNode(1); Node* temp = head; for (int i = 2; i <= 20; i++) { temp->next = createNode(i); temp = temp->next; } printf("Elimination order:\n"); Josephus(20, 5, head); return 0; } ``` 这段代码首先创建了一个包含20个节点的链表,每个节点的值代表人的编号。然后调用`Josephus`函数,按照约瑟夫环的规则淘汰人。在`Josephus`函数中,我们遍历链表,每经过m-1个人就淘汰下一个人,直到链表为空,即所有人被淘汰。 注意:这个代码假设链表的第一个节点是1号,而不是0号,因为题目中提到第一个人的编号为1。如果需要从0开始编号,只需在创建链表时从0开始即可。 [2024-07-21 11:08:32 | AI写代码神器 | 398点数解答]

相关提问