n个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,每次报数到p的人退出圈外,其余的人再从1、2、3开始报数,直到所有人都退出圈外。请按退出顺序输出每个退出人的原序号。
时间: 2023-04-03 17:03:01 浏览: 217
约瑟夫问题 设有N个人围坐一圈,现从某人开始报数, 数到M的人出列,接着从出列的下一个人重新报数,数到M的人又出列,如此下去直到所有人都出列为止,试给出他们的出列次序
3星 · 编辑精心推荐
这是一个经典的约瑟夫问题,可以使用循环链表来解决。具体实现可以参考以下代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n, p;
printf("请输入总人数n和报数p:");
scanf("%d%d", &n, &p);
// 创建循环链表
Node *head = (Node*)malloc(sizeof(Node));
Node *cur = head;
for (int i = 1; i <= n; i++) {
cur->num = i;
if (i == n) {
cur->next = head;
} else {
cur->next = (Node*)malloc(sizeof(Node));
cur = cur->next;
}
}
// 开始报数
int count = 0;
while (cur->next != cur) {
count++;
if (count == p) {
printf("%d ", cur->num);
Node *tmp = cur->next;
cur->num = tmp->num;
cur->next = tmp->next;
free(tmp);
count = 0;
} else {
cur = cur->next;
}
}
printf("%d\n", cur->num);
// 释放内存
cur->next = NULL;
while (head != NULL) {
Node *tmp = head;
head = head->next;
free(tmp);
}
return 0;
}
注意,这里的输出顺序是按退出顺序输出每个退出人的原序号。
阅读全文