以c语言编写:有M个人围坐成一圈, 编号依次从1开始递增直到M,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。所有出列的人再次按出列顺序围坐成一圈,并从第1人开始报数,这次为报到K的人出队列,然后再从下一人开始重新报数,报到K的人出列;重复这一过程,直至所有人出列。求最后出列次序。题目输入包括M、N、K三个正整数;N、K可能为1。题目要求按最后出队列顺序输出他们的编号,每个测试用例结果占一行,每个编号占4位。 输入格式: 正整数 M和两个报数。 输出格式: 每个测试用例结果占一行,每个编号占4位。 输入样例: 10 3 5 输出样例: 在这里给出相应的输出。例如: 7 4 1 6 10 5 3 2 8 9
时间: 2024-03-21 18:41:36 浏览: 57
以下是使用循环链表实现的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node* next;
} Node;
void add(Node* head, int num) {
Node* p = head;
while (p->next != head) {
p = p->next;
}
Node* node = (Node*)malloc(sizeof(Node));
node->num = num;
node->next = head;
p->next = node;
}
void remove_node(Node* node) {
node->num = node->next->num;
Node* temp = node->next;
node->next = temp->next;
free(temp);
}
void print_order(Node* head) {
Node* p = head;
while (p->next != head) {
printf("%4d", p->num);
p = p->next;
}
printf("%4d\n", p->num);
}
int main() {
int m, n, k;
while (scanf("%d%d%d", &m, &n, &k) != EOF) {
Node* head = (Node*)malloc(sizeof(Node));
head->num = 1;
head->next = head;
for (int i = 2; i <= m; i++) {
add(head, i);
}
Node* p = head;
while (p->next != p) {
for (int i = 1; i < n; i++) {
p = p->next;
}
remove_node(p);
}
print_order(head);
head->num = head->next->num;
head->next = head->next->next;
free(p);
p = head;
while (p->next != p) {
for (int i = 1; i < k; i++) {
p = p->next;
}
remove_node(p);
}
print_order(head);
free(head);
}
return 0;
}
```
代码思路如下:
1. 定义一个循环链表,每个节点存储一个人的编号。
2. 初始化链表,依次添加从 1 到 M 的编号。
3. 从链表头开始遍历,每次遍历到第 N 个节点,将其删除,直到链表只剩一个节点。
4. 输出剩下节点的编号序列。
5. 重新初始化链表,将刚才删除的节点按顺序添加到链表中。
6. 从链表头开始遍历,每次遍历到第 K 个节点,将其删除,直到链表只剩一个节点。
7. 输出剩下节点的编号序列。
8. 释放链表节点占用的内存空间。
阅读全文