用C语言编写代码解决问题:n 个人围成一圈,编号依次从1~n,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
时间: 2024-03-10 18:11:20 浏览: 111
你好!下面是一个用 C 语言编写的代码,实现了你描述的问题:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建循环链表
Node* createCircularList(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node* curr = head;
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
curr->next = newNode;
curr = newNode;
}
curr->next = head; // 将链表首尾相连,形成循环链表
return head;
}
// 删除指定节点,并返回下一个节点
Node* deleteNode(Node* node) {
Node* nextNode = node->next;
node->next = nextNode->next;
free(nextNode);
return node->next;
}
// 求解出圈顺序
void solveJosephusProblem(int n, int m) {
Node* head = createCircularList(n);
Node* curr = head;
printf("依次出圈的人的编号:");
while (n > 0) {
for (int i = 1; i < m; i++) {
curr = curr->next;
}
curr = deleteNode(curr);
printf("%d ", curr->data);
n--;
}
free(curr);
}
int main() {
int n, m;
printf("请输入人数 n 和报数 m:");
scanf("%d %d", &n, &m);
solveJosephusProblem(n, m);
return 0;
}
```
这段代码中,我们首先创建一个循环链表,每个节点表示一个人,并按照编号从1到n进行初始化。然后,通过模拟报数的过程,依次删除指定节点,直到所有人都出圈。最后,输出依次出圈人的编号。
注意:为了简化代码,这里没有进行输入的合法性检查,请确保输入的 n 和 m 的值合法。
阅读全文