C语言写程序有n个人国成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的人。
时间: 2023-12-23 21:48:42 浏览: 68
这道题可以使用循环链表来模拟人围成一圈的情形,具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
struct Node* next;
} Node;
int main() {
int n = 0;
printf("请输入总人数n:");
scanf("%d", &n);
// 创建循环链表
Node* head = NULL;
Node* tail = NULL;
for (int i = 1; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->number = i;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
tail->next = head; // 链表成环
int count = 0; // 报数计数器
Node* prev = tail; // 上一个节点,用于删除当前节点
Node* current = head; // 当前节点,从头节点开始报数
while (current->next != current) {
count++;
if (count == 3) {
count = 0;
printf("出圈的人是:%d\n", current->number);
prev->next = current->next;
free(current);
current = prev->next;
} else {
prev = current;
current = current->next;
}
}
printf("留下来的人是:%d\n", current->number);
// 释放内存
free(current);
return 0;
}
```
在程序中,首先输入总人数n,然后通过循环链表模拟人围成一圈的情形。每次从头节点开始报数,每报到3就删除当前节点,直到链表中只剩下一个节点,即为最后留下的人。
阅读全文