用c语言编写一道程序:有n个人围城一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人是几号
时间: 2023-12-23 14:15:48 浏览: 80
好的,这是一个经典的约瑟夫问题,可以使用循环链表来解决。以下是用 C 语言编写的程序:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int num; // 编号
struct Node *next; // 指向下一个节点的指针
};
int main() {
int n, count = 0;
printf("请输入参与人数 n:");
scanf("%d", &n);
// 创建循环链表
struct Node *head = NULL, *tail = NULL;
for (int i = 1; i <= n; i++) {
struct Node *node = (struct Node *) malloc(sizeof(struct Node));
node->num = i;
if (head == NULL) {
head = node;
} else {
tail->next = node;
}
tail = node;
}
tail->next = head; // 链表头尾相接,形成循环链表
// 开始游戏
struct Node *p = head, *prev = tail;
while (p != p->next) { // 当链表中只剩一个节点时结束
count++;
if (count == 3) {
prev->next = p->next; // 删除当前节点
printf("%d 号出局\n", p->num);
free(p); // 释放内存
p = prev->next;
count = 0;
} else {
prev = p;
p = p->next;
}
}
printf("最后留下的是 %d 号\n", p->num);
free(p); // 释放内存
return 0;
}
```
程序运行后,会要求输入参与人数 n,然后依次报数,直到只剩下一个人为止。最后输出留下来的人的编号。
阅读全文