题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
母牛每年的数目:1,2,3,4,6,9,13,18
由递推可得n>=4时,母牛在第n年的数目为第(n-1)年的数目加上第(n-2)年的数目,
即f(n)=f(n-1)+f(n-3);
1.使用c语言做递归实现
#include<stdio.h>
int fact(int n)
{
if(n<=4)
return n;
else
return fact(n-1)+fact(n-3);
}
int main()
{
int n;
scanf("%d",&n);
while(n)
{
printf("%d\n",fact(n));
scanf("%d",&n);
}
return 0;
}
2.用for循环做非递归实现
(1)借助中间变量表示过程
#include<stdio.h>
int fact(int n)
{
int x=1,y=2,z=3,t;
if(n<=3)
return n;
for(int i=3;i<n;i++)
{
t=x+z;
x=y;
y=z;
z=t;
}
return z;
}
int main()
{
int n;
scanf("%d",&n);
while(n)
{
printf("%d\n",fact(n));
scanf("%d",&n);
}
return 0;
}
(2)直接使用数组进行计算
#include<stdio.h>
int fact(int n)
{
int s[100]={0,1,2,3,4};
if(n<=4)
return n;
for(int i=5;i<=n;i++)
{
s[i]=s[i-1]+s[i-3];
}
return s[n];
}
int main()
{
int n;
scanf("%d",&n);
while(n)
{
printf("%d\n",fact(n));
scanf("%d",&n);
}
return 0;
}
3.使用矩阵(此处笔者采用c++语言)
参照斐波那契数列的矩阵算法,用Y.b[0][0]表示f(n),Y.b[1][0]表示f(n-2),Y.b[2][0]表示f(n-3).
借助T来为Y做数据的临时存储;
#include <iostream>
using namespace std;
//定义矩阵
struct node
{
int b[3][3];
}X,Y;
node fact(node X,node Y)
{
node T;
//对T做初始化
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
T.b[i][j]=0;
}
}
for(int i=0;i<3;i++){
for(int j=0;j<2;j++){
for(int k=0;k<3;k++){
T.b[i][j]+=Y.b[k][j]*X.b[i][k];
}
}
}
return T;
}
int main()
{
int n;
cin>>n;
while(n)
{
if(n<=4)
{
cout<<n<<endl;
}
else
{
n-=4;
//分别对X,Y做初始化
//X为3行3列方正
X.b[0][0]=1;
X.b[0][1]=1;
X.b[0][2]=0;
X.b[1][0]=1;
X.b[1][1]=0;
X.b[1][2]=-1;
X.b[2][0]=0;
X.b[2][1]=1;
X.b[2][2]=0;
//Y为3行2列
Y.b[0][0]=4;
Y.b[0][1]=0;
Y.b[1][0]=2;
Y.b[1][1]=0;
Y.b[2][0]=1;
Y.b[2][1]=0;
while(n--)
{
Y=fact(X,Y);
}
cout<<Y.b[0][0]<<endl;
}
cin>>n;
}
}