有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
Sample Input
2 4 5 0
Sample Output
2 4 6
此题实在是不容易记,我做了三遍了,最后还是要再推一遍方可ac,接下来就说一下基本思路。
其实这也是一道递归题目,此类题目就像是初中找规律一样,解题过程如下:
第一年 母牛1 小牛0;1
第二年 母牛1 小牛1;2
第三年 母牛1 小牛 2;3
第四年 母牛1 小牛 3;4
第五年 母牛2 小牛4;6
第六年 母牛3 小牛6;9
第七年 母牛4 小牛 9;13
第八年 母牛6 小牛13;19
……
是不是发现规律了呢?其实这道题关键需要理解的是何时统计牛的数量;以及小母牛何时成为母牛这个点,题中所述,第四年小母牛成为母牛,而统计母牛的数量则是在其之前所以第四年母牛有一头,小母牛则有三头。到此结束
规律如下:设总母牛数f(x),由上可知,小母牛有f(x-1)头,而母牛有g(x)头,g(x)又有如下规律:g(x)=g(x-1)+g(x-3);代码就出来了
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int a,b,c;
int fb(int i){
if(i<=4){
return 1;
}
int s=fb(i-1)+fb(i-3);
return s;
}
int fa(int i){
if(i==1) return 1;
if(i==2) return 2;
if(i==3) return 3;
if(i==4) return 4;
int f=fa(i-1)+fb(i);
return f;
}
int main(){
while(scanf("%d",&a)!=EOF&&a){
b=fa(a);
printf("%d\n",b);
}
return 0;
}
溜了……