一对兔子,从出生后第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