有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。写C语言
时间: 2023-11-27 09:54:55 浏览: 107
以下是使用循环链表模拟这个过程的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node { // 定义循环链表的节点结构体
int val;
struct node *next;
} Node;
int main() {
int n = 0, m = 0; // n 为总人数,m 为报到几的人退出
printf("请输入总人数和报到几的人退出:");
scanf("%d%d", &n, &m);
// 创建循环链表
Node *head = (Node*)malloc(sizeof(Node));
Node *cur = head;
for (int i = 1; i <= n; i++) {
cur->val = i;
if (i == n) {
cur->next = head; // 将最后一个节点的 next 指向头节点,形成循环链表
} else {
cur->next = (Node*)malloc(sizeof(Node)); // 创建新节点
cur = cur->next; // 指向新节点
}
}
// 模拟报数过程
Node *p = head, *prev = NULL;
int count = 1; // 计数器
while (p->next != p) { // 直到链表中只剩下一个节点,退出循环
if (count == m) {
// 报到 m 的人退出
printf("%d ", p->val);
prev->next = p->next; // 将 p 从链表中删除
free(p);
p = prev->next; // p 指向下一个节点
count = 1; // 计数器清零
} else {
prev = p;
p = p->next;
count++;
}
}
// 输出最后留下的人的编号
printf("\n最后留下的人的编号是:%d\n", p->val);
// 释放链表内存
free(p);
return 0;
}
```
阅读全文