猴子分桃

来源:互联网 发布:上汽集团有限公司知乎 编辑:程序博客网 时间:2024/04/30 15:45

题目:

五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?

解题思路:

假设有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);   }}


原创粉丝点击