c语言鲁智深吃馒头 据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头,智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说,从我开始报数(围成一圈),第5个人可以吃到馒头(并退下),按照这个公平的方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在哪个位置? 要求编程计算该位置并输出。 输入格式:无 输出格式: "%d\n"
时间: 2024-03-03 15:47:48 浏览: 90
鲁智深吃馒头c语言.md
这是一个经典的约瑟夫问题,可以使用循环链表来解决。具体而言,我们可以从1到99给每个和尚编号,然后将其连成一个循环链表。接着按照题目要求,从1开始不断报数,每次数到5的人出圈,直到只剩下一个人为止。这个最后剩下的人就是没有吃到馒头的鲁智深所在的位置。
下面是实现该算法的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num; // 和尚编号
struct Node *next; // 指向下一个结点的指针
} Node;
int main() {
Node *head, *tail, *p, *q;
int i, n = 99, m = 5, cnt = 0;
// 创建循环链表
head = tail = (Node*)malloc(sizeof(Node));
head->num = 1;
for (i = 2; i <= n; i++) {
p = (Node*)malloc(sizeof(Node));
p->num = i;
tail->next = p;
tail = p;
}
tail->next = head;
// 按照题目要求出圈
p = head;
while (p->next != p) {
cnt++;
if (cnt == m) {
q->next = p->next;
free(p);
p = q->next;
cnt = 0;
} else {
q = p;
p = p->next;
}
}
// 输出结果
printf("%d\n", p->num);
// 释放内存
free(p);
return 0;
}
```
输出结果为:```63```,即鲁智深所在的位置。
阅读全文