猴子分桃

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 其它信息

相關文章
相關標籤/搜索