约瑟夫问题:N个人围成一圈,从第一个人开始报嫩,数到M的人出圈: 再由下一个人开始报数,数到M的人出圈:输出依次出圈的人的编号。N.M由键盘输入。 讲解用C语言
时间: 2023-05-19 11:04:46 浏览: 105
好的,让我来回答你的问题。以下是约瑟夫问题的C语言代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n, m;
printf("请输入N和M:");
scanf("%d%d", &n, &m);
Node *head = (Node*)malloc(sizeof(Node));
head->num = 1;
head->next = NULL;
Node *tail = head;
for (int i = 2; i <= n; i++) {
Node *p = (Node*)malloc(sizeof(Node));
p->num = i;
p->next = NULL;
tail->next = p;
tail = p;
}
tail->next = head;
Node *p = head;
Node *prev = tail;
while (p->next != p) {
for (int i = 1; i < m; i++) {
prev = p;
p = p->next;
}
printf("%d ", p->num);
prev->next = p->next;
Node *temp = p;
p = p->next;
free(temp);
}
printf("%d\n", p->num);
free(p);
return 0;
}
这个程序使用了循环链表来模拟约瑟夫问题的过程。首先创建一个循环链表,然后从头结点开始,每次数到第M个节点,就将该节点从链表中删除,并输出该节点的编号。直到链表中只剩下一个节点为止,输出该节点的编号即可。
希望这个回答能够帮到你。
阅读全文
相关推荐

















