题目:鲁智深吃馒头
据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头,智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说,从我开始报数(围成一圈),第5个人可以吃到馒头(并退下),按照这个公平的方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在哪个位置?
要求编程计算该位置并输出。
解决源码:(完整代码)
#include <stdio.h>
int main()
{
int alstu[100] = { 0 };
int arr[99] = { 0 };
int count = 0;
int count2 = 0;
int i = 0;
int j = 0;
int k = 0;
while(count2 != 1)
{
count2 = 0;
if (count == 5)
{
count = 0;
}
for (i = 0;i < 100;i++)
{
if (alstu[i] == 0)
{
count++;
}
if (count % 5 == 0 && alstu[i] == 0)
{
alstu[i] = 1;
}
}
for (j = 0;j < 100;j++)
{
if (alstu[j] == 0)
{
count2++;
}
}
}
for (i = 0;i < 100;i++)
{
if (alstu[i] == 0)
{
printf("position = %d\n", i+1);
}
}
return 0;
}
代码块解释:
代码的逻辑:
先创建一个100个人的数组,因为每次报数报到5的人就会出局,那么我们只需要将原先100个人的数组的初始值全部赋值为0,出局的人就赋值为1即可,最后在找到鲁智深在的位置的时候,只需要遍历数组中所有的元素,找到数组元素值为0的元素的下标+1进行打印即可
代码的编写:
代码初始化
int alstu[100] = { 0 };//创建一个100个人的数组
int arr[99] = { 0 };//这里记录的是每一次退出的人
int count = 0;//记录报数
int count2 = 0;//记录数组中还有多少个元素不是1
int i = 0;//循环变量
int j = 0;//循环变量
int k = 0;//循环变量
代码的内部主for循环
for (i = 0;i < 100;i++)
{
if (alstu[i] == 0)//判断这里的元素是否为0
{
count++;//如果这里的元素为0,则坐在这里的人进行报数
}
if (count % 5 == 0 && alstu[i] == 0)
{
alstu[i] = 1;//报数报到5的人从0改成1
}
}
代码外部while循环
while(count2 != 1)//如果只有1一个人的数组值不是1,那么就退出循环
{
count2 = 0;//每一次进入循环的时候,都必须重置count2的大小
}
打印鲁智深最后在的位置
for (i = 0;i < 100;i++)
{
if (alstu[i] == 0)
{
printf("position = %d\n", i+1);
}
}