写一个c语言程序 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
时间: 2023-12-23 21:48:33 浏览: 50
Python使用列表完成程序的编写:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡是报到m的人退出圈子,问最后留下的是原来第几号的人。
5星 · 资源好评率100%
以下是一个使用循环链表实现的 C 语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node* next;
} Node;
int main() {
int n, count = 0, m = 3;
printf("请输入总人数n:");
scanf("%d", &n);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
head->num = 1;
Node* p = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->num = i;
p->next = node;
p = node;
}
p->next = head; // 链表首尾相连
// 开始报数
Node* q = head;
Node* prev = NULL;
while (q->next != q) { // 直到只剩下一个人
count++;
if (count == m) { // 报到3
count = 0;
printf("第%d个人出圈\n", q->num);
prev->next = q->next; // 从链表中删除该结点
Node* temp = q;
q = q->next;
free(temp); // 释放内存
} else {
prev = q;
q = q->next;
}
}
printf("最后留下的是原来的第%d号的那位\n", q->num);
free(q); // 释放最后剩下的结点的内存
return 0;
}
```
程序运行后,会要求输入总人数 `n`,然后依次报数,每报到 3 就将该结点从链表中删除,直到只剩下一个结点为止。最后输出最后剩下的结点的编号。
阅读全文