题目:
五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?
解题思路:
假设有X个桃子,第一次把X个桃子分成5份,恰好多了1,然后拿走一份!再这里,您应该想到借他4个不就正好5份了麽?然后每次都不是5份了麽?最后当前猴子拿走的也没多拿不是麽?举个例子说明一下吧,假设有5只猴子,第一次每份
(X-1)/5;如果我们借给他4个,每份不就是(X+4)/5吗?然后您会发现,(X+1)/5=(X-1)/5+1;每次都是如此,然后每次都能被5整除,这很显然,所以您应该懂了吧~{^_^}X=5^n-4
程序:
package monkey;
public class Test {
public static void main(String[] args) {
// System.out.println(d());
System.out.println(f(0.0));
}
/**
* 循环算法
* peach 分配完毕后剩余的桃子数
* count 分配之前的桃子数
* @return
*/
private static double d() {
double count = 0.0;
//死循环,一直到找到这个数为止
while (true) {
//每次循环都要桃子数加一
count++;
//由桃子总数算出第五个猴子分完后剩下的桃子数,而这个数必须是整数
double peach = count;
for (int monkey = 5; monkey > 0; monkey--) {
peach = (peach - 1) * 0.8;
}
//如果peach是整数,就返回桃子的总数量
if (peach % 1 == 0.0)
return count;
}
}
/**
* 递归算法
* peach 分配完毕后剩余的桃子数
* count 分配之前的桃子数
* @param count
* @return
*/
private static double f(double count) {
count++;
double peach = count;
for (int monkey = 5; monkey > 0; monkey--) {
peach = (peach - 1) * 0.8;
}
if (peach % 1 == 0.0)
return count;
else
return f(count);
}
}