题目来源:
1.HDU-2018//wustoj-problem-1182
Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
Sample Input
2
4
5
0
Sample Output
2
4
6
解题思路
- 原理:斐波那契数列;
- 找规律:可以先把前几年的列出来,然后找规律;
第N年 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
母牛的数量 | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 | 28 | 41 |
可见:
第四年:4=3+1;
第五年:6=4+2;
第六年:9=6+3;
即:每一年的母牛数量就是 一年前的数量加上 三年前的数量。
即: F [ n ] = F [ n - 1 ] + F [ n - 3 ]
具体代码如下:
#include<stdio.h>
int main()
{
int f[55],n;
f[1]=1;//第1年的母牛数量
f[2]=2;//第2年的母牛数量
f[3]=3;//第3年的母牛数量
while(scanf("%d",&n)!=EOF)
{
for(int i=4;i<=n;++i)//从第四年开始满足递推公式
{
f[i]=f[i-1]+f[i-3];//递推公式
}
printf("%d\n",f[n]);//输出第n年的母牛 数量
}
return 0;
}
还有另外一种比较好理解的实现方法
具体代码如下
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n>0&&n<55)
{
int sum=1,mature=1,first_year=0,second_year=0,third_year=0;
for(int i=1;i<n;i++)
{
mature+=third_year;//这一次成熟的母牛数等于之前成熟的加上第三年的
third_year=second_year;//这一次第三年的等于上一次第二年的
second_year=first_year;//这一次第二年的等于上一次第一年的
first_year=mature;//这一次第一年的等于这一次成熟的母牛(因为这一次有多少成熟的,就生了多少小牛//注意不是看上一次成熟的)
sum=mature+first_year+second_year+third_year;//总数量等于成熟的+第一年+第二年+第三年
}
printf("%d\n",sum);
}
return 0;
}