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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值