[程式設計題]統計每個月兔子的總數
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;
}