一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:
输入在一行中给出一个不超过10000的正整数N。

输出格式:
在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9


分析:
由题意可知:此数列为一个斐波拉契数列,即满足
1 1 2 3 5 8 13 22 35 .....这样的规律
0 1 2 3 4 5 6 7 8
#include <stdio.h>

int main(){

int i,temp = 0;
int N;
int a[100];
a[0] = 1,a[1] = 1;
scanf("%d",&N);

    for ( i = 2; i < 100; i++) {
        a[i] = a[i - 2] + a[i - 1];
        temp = a[i];

        if(temp>=N){
            printf("%d",i+1);
            break;
        }
    }



return 0;

}
该种做法太过于笨重,定义了一个不可变的数组,浪费了一些内存空间,而且当测试N过大时,程序不能解决该问题了,这是一种迫不得已的做法。


在csdn上看见“云上明月”,提供了一种很好的思路。
#include <stdio.h>

int main(int argc, char **argv) {

int a = 0,b = 1,temp,N,month = 1;//b 代表累加的和(总兔子的只数),初始值为1
scanf("%d",&N);

while(b<N){
    month++;
    temp = a;//a 表示新生的兔子对数
    a = b;
    b = b+temp;
}
printf("%d\n",month);

return 0;

}
created by 10/21 22:06