猴子分桃

1 题目描述

  老猴子辛苦了一生,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
  第一个猴子来了,它把桃子分红五堆,五堆同样多,但还多出一个。它把剩下的一个留给老猴子,本身拿走其中的一堆。
  第二个猴子来了,它把桃子分红五堆,五堆同样多,但又多出一个。它把多出的一个留给老猴子,本身拿走其中的一堆。
  后来的小猴子都如此照办。最后剩下的桃子所有留给老猴子。
  这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能获得几个桃子。java

1.1 输入描述:

  输入包括多组测试数据。
  每组测试数据包括一个整数n(1≤n≤20)。
  输入以0结束,该行不作处理。算法

1.2 输出描述:

  每组测试数据对应一行输出。
  包括两个整数a,b。
  分别表明开始时最小须要的桃子数,和结束后老猴子最少能获得的桃子数。数组

1.3 输入例子:

5
1
0

 

1.4 输出例子:

3121 1025
1 1

 

2 解题思路

2.1 求总的桃子数

  假设桃子一块儿有x个,第i只猴子用ai表示,第一只儿子拿走的桃子数为:a1=15(x−1)。第二只儿子拿走的桃子数为:a2=(4a1−1)5,第三只猴子拿走的桃子数为:a3=(4a2−1)5,••••••以此类推。
根据分析有递推关系:测试

 

an=(4an−1−1)5spa

⇔5an=4an−1−1.net

⇔5(an+1)=4(an−1+1)code

 

  得图片

 

an+1=(45)n−1(a1+1)get

an=(45)n−1(a1+1)−1io

 

  又a1=15(x−1)代入可得:

 

an=(45)n−1(15(x−1)+1)−1

an=4n−15n(x+4)−1

 

  由于an为整数,因此x+4是5n的倍数。要取x最小,令x+4=5n,得:

 

x=5n−4

 

  即为所求的总的桃子数。

2.2 全部小猴子分得的桃子数

  全部小猴子分得的桃子数:

 

i=1nai

⇔∑i=1n((45)i−1(ai+1)−1)

⇔(ai+1)∑i=1n(45)i−1−n

⇔(ai+1)(1−(45)n1−45)−n

 

  又,a1=15(x−1),x=5n−4,得:

 

a1=5n−1−1

 

  再得:

 

5n−1(1−(45)n1−45)−n

⇔4∗5n−1−4nn

 

  所以小猴子们分的桃子总数为:

 

5n−4nn

 

2.3 老猴子最后得到的桃子数

 

5n−4−(5n−4nn)

⇔4n+n−4

 

 

3 算法实现

import java.util.Scanner;

/**
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            if (n == 0) {
                break;
            }

            long[] r = peach(n);
            System.out.println(r[0] + " " + r[1]);
        }

        scanner.close();
    }

    /**
     * 分桃子
     * <p>
     * 解题思路:见PDF或者WORD
     *
     * @param n 小猴子的数目
     * @return 长度为二的一维数组,第一个表示最少的桃子数目,第二个表示老猴子最小能够获得的桃子数
     */
    private static long[] peach(int n) {
        long power5 = 1;
        long power4 = 1;

        for (int i = 0; i < n; i++) {
            power4 *= 4;
            power5 *= 5;
        }

        return new long[]{power5 - 4, power4 + n - 4};
    }
}

 

4 测试结果

这里写图片描述

5 其它信息

相关文章
相关标签/搜索