一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
列表分析:
第1个月 | 第2个月 | 第3个月 | 第4个月 | 第5个月 | 第6个月 | 第7个月 | 第8个月 | 第9个月 | 第10个月 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
1 | 1 | 1 | 1 | 1 | 1 | ||||
1 | 1 | 1 | 1 | 1 | |||||
1+1=2 | 1+1=2 | 1+1=2 | 1+1=2 | ||||||
1+1+1=3 | 1+1+1=3 | 1+1+1=3 | |||||||
1+1+1+2=5 | 1+1+1+2=5 | ||||||||
1+1+1+2+3=8 | |||||||||
1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
由表可知,S(1)=1, S(2)=1, S(3)=2=S(1)+S(2), 以此类推,S(n)=S(n-1)+S(n-2),式中n表示第n个月,S表示兔子的总数。
此题解法:
要求输入S的值,求n的值。
#include <stdio.h>
/*
N -- 给定兔子总数
S -- 当前兔子总数
n -- 第n个月
temp -- 中间量
*/
int main(void)
{
int N;
scanf("%d", &N);
int n = 1;
int S = 1;
int temp = 0;
while ( S < N )
{
n++;
if ( n == 2 )
{
S += temp;
temp = S;
}
else
{
S += temp;
temp = S - temp;
}
}
printf("%d\n", n);
return 0;
}