有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。用c语言表示
时间: 2023-11-23 16:59:29 浏览: 69
python 有n个人围成一圈,顺序排号,问最后留下的是原来第几号的那位。(示例)
5星 · 资源好评率100%
可以使用循环链表来模拟这个过程,每次删除报数为3的节点,直到只剩下一个节点。最后剩下的节点即为答案。
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node* next;
} Node;
int main() {
int n = 0, k = 0;
printf("请输入总人数n和报数k:");
scanf("%d %d", &n, &k);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
head->num = 1;
Node* cur = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->num = i;
cur->next = node;
cur = node;
}
cur->next = head; // 将最后一个节点的next指针指向头节点,形成循环链表
// 模拟删除过程
Node* p = head;
while (p->next != p) { // 当只剩一个节点时停止循环
for (int i = 1; i < k - 1; i++) {
p = p->next; // 找到待删除节点的前一个节点
}
Node* tmp = p->next;
p->next = tmp->next; // 删除节点
printf("删除第%d个人\n", tmp->num);
free(tmp);
p = p->next; // 将p指向下一个节点,继续循环
}
printf("最后剩下的是第%d个人\n", p->num);
return 0;
}
```
示例输出:
```
请输入总人数n和报数k:6 3
删除第3个人
删除第6个人
删除第2个人
删除第5个人
删除第1个人
最后剩下的是第4个人
```
阅读全文