有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。C语言程序
时间: 2023-12-23 18:55:35 浏览: 152
基于Java的银行排号系统的设计与实现.zip
5星 · 资源好评率100%
以下是使用循环链表实现的 C 语言程序:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
Node *createCircle(int n) {
Node *head = (Node *)malloc(sizeof(Node));
head->num = 1;
Node *tail = head;
for (int i = 2; i <= n; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->num = i;
tail->next = newNode;
tail = newNode;
}
tail->next = head;
return head;
}
int findLast(Node *head, int m) {
Node *p = head;
while (p->next != p) {
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
Node *temp = p->next;
p->next = temp->next;
printf("出圈的人是:%d\n", temp->num);
free(temp);
p = p->next;
}
return p->num;
}
int main() {
int n, m;
printf("请输入总人数n:");
scanf("%d", &n);
printf("请输入报数m:");
scanf("%d", &m);
Node *head = createCircle(n);
int last = findLast(head, m);
printf("最后留下的人是:%d\n", last);
return 0;
}
```
其中 createCircle 函数用于创建循环链表,findLast 函数用于查找最后留下的人。程序中使用了一个指针 p 指向当前报数的人,每次循环找到第 m-1 个人,将其从链表中删除。最后剩下的一个节点即为最后留下的人。
阅读全文