酷代码 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 #include <stdio.h> #include <stdlib.h> typedef struct Node { int num; struct Node *next; } Node; Node *createCircle(int n) { Node *head = (Node *)malloc(sizeof(Node)); Node *p = head; for (int i = 1; i <= n; i++) { Node *node = (Node *)malloc(sizeof(Node)); node->num = i; p->next = node; p = node; } p->next = head->next; free(head); return p->next; } void josephus(int n, int m) { Node *head = createCircle(n); Node *p = head; while (p->next != p) { for (int i = 1; i < m - 1; i++) { p = p->next; } Node *q = p->next; printf("%d ", q->num); p->next = q->next; free(q); p = p->next; } printf("%d\n", p->num); free(p); } int main() { int n = 20; int m = 5; josephus(n, m); return 0; } ``` [2024-07-21 11:12:05 | AI写代码神器 | 590点数解答]

相关提问