一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n要求从键盘输入,存储方式采用c语言的链表实现该问题求解。
时间: 2023-05-25 16:07:18 浏览: 59
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int m, n, i;
printf("输入猴子的数量m:");
scanf("%d", &m);
printf("输入数到第几只猴子出圈n:");
scanf("%d", &n);
// 创建循环链表
Node *head, *p, *pre;
head = (Node*)malloc(sizeof(Node));
pre = head;
head->num = 1;
for(i = 2; i <= m; i++) {
p = (Node*)malloc(sizeof(Node));
pre->next = p;
p->num = i;
pre = p;
}
pre->next = head; // 链接成循环链表
// 计数器、出圈
p = head; // 从头开始数
i = 1;
while(p != p->next) {
i++;
if(i == n) { // 当数到n时,找到待出圈的节点
printf("%d号猴子出圈\n", p->num);
pre->next = p->next;
free(p);
p = pre->next;
i = 1;
} else {
pre = p;
p = p->next;
}
}
printf("剩下的猴子是%d号猴子\n", p->num);
return 0;
}
阅读全文