一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
思路:
第1个月 | 第2个月 | 第3个月 | 第4个月 | 第5个月 | 第6个月 | 第7个月 | |
---|---|---|---|---|---|---|---|
第1对兔子及儿子 | 1 | 1 | 1 | 1 | 1 | 1 | |
第2对兔子儿子 | 1 | 1 | 1 | ||||
第3对兔子儿子 | 1 | 1 | |||||
第4对兔子儿子 | 1 | ||||||
第5对兔子儿子 | 1 | ||||||
总数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
由图可以看出兔子繁衍问题就是斐波那契数列,所以这题我们只要求出总数问题就解决了,斐波那契数列问题是个递归问题,递归问题一般分支结构(基例+递归链条),所以这里定义个函数求总数。
#include<stdio.h>
int S(int n);
int main()
{
int N; //输入兔子总数对
scanf("%d",&N);
int n=1; //月份
while(S(n)<N)
{
n++;
}
printf("%d",n);
return 0;
}
int S(int n) //第n月
{
int s; //总数
if(n==1||n==2) //基例
{
s=1;
}
else //链条
{
s=S(n-1)+S(n-2); //第n个月总数等于第n-1个月与第n-2月总数之和
}
return s;
}