老萌新又开始了自己的水题之旅。。。
(不出所料的话一会儿就会被聚聚们嘲讽到桌子下面啦!)
————————————————————————冒着生命危险贴出题解
这个题了解了多人做法后总结出来了三种。
题目:
Problem Description 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。 Output 对于每个测试实例,输出在第n年的时候母牛的数量。 Sample Input 2 4 5 0 Sample Output 2 4 6 |
画图列式:
n(年份) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
f(n)(牛数) | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 | 28 | 41 |
于是乎我们会发现 f(n)=f(n-1)+f(n-3)
脑袋冒出的第一种想法,就是列函数递推,但是由于每次都要从n递推到1,时间上个人感觉要慢一些
(这样就又可以想到用数组存下每年的数量,就是另一种数组方法(咸鱼懒,不再贴代码啦))
贴上代码:
#include<iostream>
using namespace std;
int f(int a)
{
if(a<=4){return a;}
int p;p=f(a-1)+f(a-3);
return p;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0){return 0;}
cout<<f(n)<<endl;
}
return 0;
}
HDU上面这份代码运行不是0ms(趴平,被嘲讽准备)
②然后又见识到另一种方法,其实就是把函数操作过程移动到主函数内部:
#include <iostream>
using namespace std;
int main()
{
int n;
int f1, f2, f3, fn;
while(cin>>n&&n!=0)
{
f1=1;f2=2;f3=3;
if(n==1)
{cout<<f1<<endl;}
else if(n==2)
{cout<<f2<<endl;}
else if(n==3)
{cout<<f3<<endl;}
else
{
for(int i=4;i<=n;i++)
{
fn=f3+f1;
f1=f2; //f1代表前3年
f2=f3; //f2代表前2年
f3=fn; //f3代表前1年
}
cout<<fn<<endl;
}
}
return 0;
}