1. 程式人生 > >兔子繁衍問題(斐波那契數列)

兔子繁衍問題(斐波那契數列)

兔子繁衍問題(15 分)

一對兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,至少需要繁衍到第幾個月時兔子總數才可以達到N對?

輸入格式:
輸入在一行中給出一個不超過10000的正整數N。

輸出格式:
在一行中輸出兔子總數達到N最少需要的月數。

輸入樣例:
30
輸出樣例:
9

其實去列一下前面幾個月兔子的數量就會發現,從第三個月開始,下一個月兔子的總數就為上兩個月兔子總數的和。其實這個數列是一個金典演算法題。而這種數列稱為斐波那契數列。
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>2,n∈N*)。這個數列從第3項開始,每一項都等於前兩項之和。

非遞迴C++程式碼實現如下:

#include<iostream>
using namespace std;

int main(void)
{
    int n, sum, cnt, v1, v2;
    sum = cnt = 1; //cnt表示過了幾個月,sum為兔子總數 
    v1 = v2 = 0;
    cin >> n;
    if(n > 1) { //n至少是大於等於2的數,若為1,則直接輸出cnt,即1 
        while(sum < n) { 
            v1 = v2; 
            v2 = sum;
            sum += v1;
            cnt ++;
        }
    }
    cout
<< cnt << endl; return 0; }