1. 程式人生 > >[程式設計題]統計每個月兔子的總數

[程式設計題]統計每個月兔子的總數

Talk is cheap, show me the code.

一、問題描述

有一隻兔子,從出生後第3個月起每個月都生一隻兔子,小兔子長到第三個月後每個月又生一隻兔子,假如兔子都不死,問每個月的兔子總數為多少?

/**
 * 統計出兔子總數。
 * 
 * @param monthCount 第幾個月
 * @return 兔子總數
 */
public static int getTotalCount(int monthCount)
{
    return 0;
}

輸入描述:

輸入int型表示month

輸出描述:

輸出兔子總數int型

輸入例子:

9

輸出例子:

34

二、問題分析

這個題目比較有意思,這是典型的斐波那契數列問題。然而一下可能看不出是這個問題,就算不用斐波那契數列也是可以解決這個問題的,只要弄清楚了邏輯。

思路一:
假設剛出生的兔子數為 m, 出生後第二個月的兔子數為 n, 出生後第三個月的兔子數為 t;
初始的時候 m = 1, n = 0, t = 0;
第 i 個月的時候:
t(i) = t(i-1) + n(i-1);
n(i) = m(i-1);
m(i) = t(i);

思路二:
第三個月(包含剛出生的和出生一個月,出生兩個月的兔子)的兔子總數 = 第二個月的兔子總數 + 第二個月的兔子到第三個月時新生下的兔子數;
第二個月的兔子到第三個月時新生下的兔子數 = 第二個月處在出生後一個月 + 第二個月出生後至少2個月的兔子;
(這是因為第二個月出生後一個月的兔子到了第三個月就能生兔子了,第二個月出生後至少2個月的在第三個月會繼續生兔子)
第二個月處在出生後一個月的兔子 = 第一個月剛出生的兔子;
第二個月出生後至少2個月的兔子 = 第一個月處在出生後一個月的兔子 + 第一個月出生後失少2個月的兔子;
而,第一個月剛出生的兔子 + 第一個月處在出生後一個月的兔子 + 第一個月出生後至少2個月的兔子 = 第一個月全部的兔子數;
那麼,可以得到 第二個月的兔子到第三個月時新生下的兔子數 = 第一個月全部的兔子數;
進而可以得到, 第三個月的兔子總數 = 第二個月的兔子總數 + 第一個月全部的兔子數。
這就是斐波那契數列。初始時,第一個月兔子總數為 1,第二個月兔子總數為 1。
求解斐波那契數列可以用遞迴法,或者直接用迴圈的方法解決。

解題方式1:

採用思路一直接求解。

#include <iostream>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        int s = 1, t = 0, m = 0;
        for (int i = 2; i <= n; i++)
        {
            m = m + t;
            t = s;
            s = m;
        }
        cout << s + t + m << endl;
    }

    return 0;
}

解題方式2:

採用遞迴法求解斐波那契數列。

#include <iostream>
using namespace std;

int count(int n)
{
    if (n == 1 || n == 2)
        return 1;
    return count(n - 1) + count(n - 2);
}

int main()
{
    int n;
    while (cin >> n)
    {
        cout << count(n) << endl;
    }

    return 0;
}

解題方式3:

採用迴圈的方式求解斐波那契數列,也可以說是動態規劃的方法。

#include <iostream>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        int m = 1, t = 1;
        for (int i = 3; i <= n; i++)
        {
            int temp = m;
            m = t;
            t = temp + t;
        }
        cout << t << endl;
    }

    return 0;
}