C语言趣味题——鲁智深吃馒头问题

题目:鲁智深吃馒头

据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头,智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说,从我开始报数(围成一圈),第5个人可以吃到馒头(并退下),按照这个公平的方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在哪个位置?
要求编程计算该位置并输出。

解决源码:(完整代码)

#include 
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);
        }
    }

你可能感兴趣的:(c语言,算法,数据结构)