[编程题]统计每个月兔子的总数

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 
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 
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 
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;
}

你可能感兴趣的:(nowcoder)