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个猴子分桃的主要内容,如果未能解决你的问题,请参考以下文章