兔子繁衍问题(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;
}