C语言编程 鲁智深吃馒头 据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头 智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说: 从我开始报数(围成一圈),第5个人可以吃到馒头(并退下) 按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上 请问他在那个位置? 针对以上提到的问题,试 借鉴筛法 用C语言编程求出剩下的最后一个人的位置?
时间: 2024-03-25 07:40:26 浏览: 78
C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。
这是一个经典的约瑟夫问题,可以用循环链表或递推公式求解。这里介绍一种基于筛法的解法,用C语言实现。
思路如下:先将99个数字标记为1,表示这99个和尚都在圈内。然后,从1开始,每隔5个数字将其标记为0,表示这些和尚已经出圈。直到圈内只剩下一个数字为止,这个数字即为剩下的最后一个人的位置。
具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 99 // 总人数
int main() {
int i, count = 0, pos = 0;
int *a = (int*) malloc(N * sizeof(int)); // 标记数组,1表示在圈内,0表示出圈
// 初始化标记数组
for (i = 0; i < N; i++) {
a[i] = 1;
}
while (count < N - 1) { // 只剩下一个数字时结束循环
for (i = 0; i < N; i++) {
if (a[i] == 1) { // 如果在圈内
pos++; // 记录当前位置
if (pos == 5) { // 每隔5个数字出圈
a[i] = 0;
count++;
pos = 0;
if (count == N - 1) { // 只剩下一个数字时直接输出
printf("The last one is at position %d.\n", i + 1);
return 0;
}
}
}
}
}
return 0;
}
```
运行程序,可以得到鲁智深在第27个位置,剩下的最后一个人在第40个位置。
阅读全文