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

时间: 2024-08-01 02:18:13

5个猴子分桃的相关文章

猴子分桃

猴子分桃的故事大体有两种描述: 描述 1 :五只猴子分桃.半夜,第一只猴子先起来,它把桃分成了个数相等的五堆,多出一只:于是,它吃掉了一个,拿走了一堆.第二只猴子起来一看,只有四堆桃,于是把四堆合在一起,分成相等的五堆,又多出一个:然后,它也吃掉了一个,拿走了一堆.剩下的三只猴子也都是这样分的.问:这堆桃至少有多少个? 描述 2 :海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,

猴子分桃问题的解决方法

猴子分桃问题的解决方法 1 问题 1979年,李政道博士给中国科技大学少年班出过一道智趣题:5只猴子分一堆桃子,怎么也分不成5等分,只好先去睡觉,准备第二天分.夜里1只猴子偷偷爬起来,先吃掉一个桃子,然后将其分为5等份,藏起自己的一份就去睡觉了:第二只猴子又爬起来,吃掉一个桃子后,也将桃子分成5等份,藏起自己的一份睡觉去了:以后的3只猴子都先后照此办理.问最初至少有多少个桃子? 现在考虑更加的一般性,说是m只猴子,问最初最少有多少个桃子? 2 解答: 2.1 递推解法 设最初有x个桃子,猴子的个

算法——猴子分桃

想做些有关“算法”的练习题,在网上无意间看到了一道很经典的算法题——猴子分桃,于是百度了一下,才发现这道题的相关文档很多很多,但最多的也就是使用C++或者Java来解决这道题,而自己也是初次接触C++. 1.先介绍一下C++使用最常见的编辑器——dev cpp.附上下载地址:(http://bloodshed-dev-c.en.softonic.com/download); 2.: 3.接着选好所要下载好的地址: 4.剩下的事情就是“一路默认”,直至安装完成. 然后就剩启动Dev C++,启动完

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

41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的 一个扔入海中,拿走了一份,第三.第四.第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? package cskaoyan; public class cskaoyan41 { @org.junit.Test public void peach() { int x = 0;

(二)猴子分桃问题

五只猴子分桃.半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只. 于是,它吃掉了一个,拿走了一堆: 第二只猴子起来一看,只有四堆桃.于是把 四堆合在一起,分成相等的五堆,又多出一个.于是,它也吃掉了一个,拿走了一 堆:......其他几只猴子也都是 这样分的.问:这堆桃至少有多少个? 1 #include<stdio.h> 2 int main(void) 3 { 4 int i=0,m=1,x=1; // 开始设桃子的个数为x且初始值为1,m算每次分桃后的个数,自然没分桃的时候也是m

猴子分桃问题

问题: 五只猴子分一堆桃子.第一只猴子把这堆桃子平分为五份,多了一个,这只猴子把多的一个桃子扔入海中,拿走了一份.第二个猴子把剩下的桃子又平分成五份,又多了一个,它同样把多的一个桃子扔入海中,拿走了一份,第三.第四.第五只猴子都是这样做的.问原来最少有多少只桃子? 答案: public class peach { public static void main(String [] args) { int i,sum; for(i=4;i<10000;i++) { sum=i; if(sum%5=

C++ 华为OJ 猴子分桃

[题目描述] 老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富--一大堆桃子.老猴子决定把这些桃子分给小猴子. 第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个.它把剩下的一个留给老猴子,自己拿走其中的一堆. 第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个.它把多出的一个留给老猴子,自己拿走其中的一堆. 后来的小猴子都如此照办.最后剩下的桃子全部留给老猴子. 这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子. [输入]

C++ HOJ 猴子分桃

[题目描写叙述] 老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的財富--一大堆桃子.老猴子决定把这些桃子分给小猴子. 第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个.它把剩下的一个留给老猴子,自己拿走当中的一堆. 第二个猴子来了.它把桃子分成五堆.五堆一样多,但又多出一个.它把多出的一个留给老猴子,自己拿走当中的一堆. 后来的小猴子都如此照办.最后剩下的桃子所有留给老猴子. 这里有n仅仅小猴子,请你写个程序计算一下在開始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子. [输

YTU 1922: 猴子分桃

Description 老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富--一大堆桃子.老猴子决定把这些桃子分给小猴子. 第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个.它把剩下的一个留给老猴子,自己拿走其中的一堆. 第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个.它把多出的一个留给老猴子,自己拿走其中的一堆. 后来的小猴子都如此照办.最后剩下的桃子全部留给老猴子. 这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子.