题目:
五只猴子分一堆桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;......其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?
分析:
设第一只到第五只猴子分的每个堆的大小分别为a, b, c, d, e。那么满足如下的关系:
4*a = 5*b+1 。。。。(1)//第一只猴子走后剩下的桃子数为4*a; 第二只猴子将这些桃分成5堆,每堆大小为b (以下关系式类似)
4*b = 5*c+1 。。。。(2)
4*c = 5*d+1 。。。。(3)
4*d = 5*e+1 。。。。(4) //第五只猴子在第四只猴子走后的分法是5*e+1
消除中间变量,只保留a和e,得到关系式:
4^4*a=5^4*e + 369
即256*a = 625*e + 369 。。。。(5)
总的桃子数是S=5*a+1
要求S的最小值,相当于求a的最小值,也就是相当于求e的最小值,所以只需要在式(5)中将正整数e从初始值1开始循环,满足a也是正整数的结果就是S的最小值。
注:如果仅仅满足(5)式,并不能完全保证上面(1)到(4)式的成立,因此可以将计算出的a依次代入(1)到(4)式检验是否正确(这里的代码中没有做校验)。
代码:
public class MonkeyPeaches {
public static void main(String[] args) {
//4^4.x=5^4.y + 369
//or: 256x = 625y + 369
int sum = 625+369;
while(true){
int r = sum%256;
if(r==0){
int total = sum/256 * 5 + 1;
System.out.format("total peaches:%d%n",total);
break;
}
sum+=625;
}
}
}
输出:
total peaches:3121