5个猴子分桃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5个猴子分桃相关的知识,希望对你有一定的参考价值。

猴子分桃

山洞里有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔到洞外,拿走了一份;
第二只猴子把剩下的桃子平均分成五份,又多了一个,它同样把多的一个扔到洞外,拿走了一份;
第三、第四、第五只猴子都是这样做的,问山洞里原来最少有多少个桃子?

/*猴子分桃。

问题描述:山洞里有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔到洞外,拿走了一份;
第二只猴子把剩下的桃子平均分成五份,又多了一个,它同样把多的一个扔到洞外,拿走了一份;
第三、第四、第五只猴子都是这样做的,问山洞里原来最少有多少个桃子?


分析题目:
      假设现在我为其中的任意一只猴。面对眼前的桃子,我扔掉一只,发现剩下的够我们兄弟5个平均分的。拿走属于我的一份.
      如果理解到这里.基本上也就知道怎么写算法了.只要能求出每一个猴子当前桃子总数,最后就能求出最终结果.
      还有一个问题就是从什么地方入手,是知道第一只猴子面前的总数还是最后一只猴子面前的总数.

再次假设:
     1:知道第一只猴子面前的总数n.那么下一只猴子面前应该有(n-1 - (n - 1)/5)个桃子.可以利用一个循环来实现n的值是否满足要求.这是算法1.
     2:如果知道最后一只猴子面前的总数n(包括多出来的那一个),那么上一只猴子面前应该有n/4 * 5 + 1个桃子.同样,也可以利用一个循环来验证满足条件的n值.这是算法2.

算法2:      
        temp为第n个猴子拿走自己的一份前看到的桃子数(扔掉一个以后的),temp1为第n-1个猴子拿走自己的一份前看到的桃子数
        temp和temp1的关系: temp1-1/5*temp1=temp+1   即temp1=(temp+1)*5/4    
        temp1和temp是第n个猴子与第n-1个猴子在取走自己的那一份之前的桃子个数,建立前后递推公式
*/
#include<iostream>
using namespace std;
int main()
{
    int Count = 5;  //Count为第5个猴子拿走自己的一份前,总共的桃子数,最少为5,即第5个猴子拿走1个
    //循环从count=6开始,依次递增,来判断是否合理
    while (true) 
    {
        int i = 1;  //i来记录猴子数
        int Temp = Count;   //temp从count数开始,第5个猴子拿走自己那一部分前的桃子总数
        //temp为第n个猴子拿走自己的一份前看到的桃子数,temp1为第n-1个猴子拿走自己的一份前看到的桃子数
        //temp和temp1的关系: temp1-1/5*temp1=temp+1   即temp1=(temp+1)*5/4    
        //temp1和temp是第n个猴子与第n-1个猴子在取走自己的那一份之前的桃子个数
        while ((Temp % 5 == 0) && ((Temp + 1) % 4 == 0)) //拿走前的桃子个数是5的倍数并且(temp+1)整除4,是为了前一个猴子的满足关系 Temp = (Temp + 1) / 4 * 5;
        {
            i++;  //增加猴子数,往前判断
            Temp = (Temp + 1) / 4 * 5; //前一个猴子拿走自己那一份前所看到的桃子个数
            if (i == 5)   
            {
                Count = Temp + 1;  //计算到第一个猴子了,总数等于第一个猴子拿走之前的总数再加1(扔掉的那个)
                break;
            }
        }

        if (i == 5)  
        {
            break;  //计算到第一个猴子了,结束循环,跳出(表示对所有5只猴子的桃子数的判断都合理,满足题目要求)
        }

        Count++;  //Count增1,进入下一此循环
    }
    cout<<"山洞里原来最少的桃子个数:"<<Count<<endl;
    return 0;
}

山洞里原来最少的桃子个数:3121

以上是关于5个猴子分桃的主要内容,如果未能解决你的问题,请参考以下文章

猴子分桃问题

C语言枚举问题 猴子分桃

JAVA 基础编程练习题41 程序 41 猴子分桃

算法——猴子分桃

python进阶练习之——猴子分桃❤️

每日一题 | day28(奇数位上都是奇数或者偶数位上都是偶数 | 猴子分桃)