题目:



描述:

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 n 年的时候,共有多少头母牛?


输入:

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数 n(0<n<55),n 的含义如题目中描述。

n=0 表示输入数据的结束,不做处理。


输出:

对于每个测试实例,输出在第 n年的时候母牛的数量。

每个输出占一行。


分析



我们先列出一个表格,把每一年对应的母牛数量写出来。


第 n年:12345678
f[n] 头牛:1
23469
1319


先看第 4 年,对应有 4 头母牛,4 = 3+1;
再看第 5 年,对应有 6 头母牛,6 = 4+2;
最后看第 6 年,对应有 9 头母牛,9 = 6+3;


没错,是有规律的,该年母牛的数量就是一年前的数量再加上三年前的数量,

用公式表示就是 f[n] = f[n-1] + f[n-3]


参考代码:



迭代法:

先给出用迭代法的代码,因为它长

#include<iostream>
using namespace std;
int main()
{
    int n, i;
    int f1, f2, f3, fn;
    while (cin >> n && n != 0)  //输入 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 (i = 4; i <= n; i++)
            {
                fn = f3 + f1;  
                //把该年迭代为一年前,一年前迭代为两年前,依次类推
                f1 = f2;  //f1代表 3 年前
                f2 = f3;  //f2代表 2 年前
                f3 = fn;  //f3代表 1 年前
            }
            cout << fn << endl;  //fn
        }
    }
    return 0;
}

数组:

最后给出用数组的,用数组相对来说会好一点,因为迭代一次,然后就可以输出了。上面那个代码每输入一个数都需要重新迭代,数量大且多的话,花费的时间会比较多。

#include<iostream>
using namespace std;
int main()
{
    int n, i;
    int f[55] = { 0,1,2,3 };  //f[0]=0,f[1]=1,f[2]=2,f[3]=3
    for (i = 4; i < 55; i++)
        f[i] = f[i - 1] + f[i - 3];
    while (cin >> n && n != 0)  //输入 n 的值,且 n 不等于0,则进入,否则退出
    {
        cout << f[n] << endl;
    }
    return 0;
}


点赞(131)
 

0.0分

211 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 93 条评论

Rengar 4年前 回复TA
@bbcy 哦不好意思看错了,可以给出完整代码吗
Rengar 4年前 回复TA
@bbcy 题目好像是要输入年份,不是固定55吧
bbcy 4年前 回复TA
#include<iostream>
using namespace std;
int main(){
    int n;//n为年数
    int f[54]={1,2,3,4};//f[0]表示第一年,f[1]表示第二年,....
    while(cin>>n&&n!=0){
        f[n-1]=f[n-2]+f[n-4];
        cout<<f[n-1];
    }
    return 0;
}
这运行都能通过,但是测试平台说有错误
霖霖林林想上分 4年前 回复TA
#include<cstdio>
#include<string.h>
int num(int y)
{
    int f=0;
    if(y<=4)
    {
        f=f+y;
        return f;
    }
    else
    {
        f=num(y-3)+num(y-1);
    }
}
int main()
{
    int n[101],i=0;
    while(1)
    {
        scanf("%d",&n[i]);
        if(n[i]==0) break;
        i++;
    }
    for(int j=0;j<i;j++)
    {
        printf("%d\n",num(n[j]));
    }
    return 0;
}
yuan 4年前 回复TA
@凌木 用递归会超时
是校长大人呐 4年前 回复TA
#include<stdio.h>
int main()
{

	int k, t[4], Max, Num[54], i;
	for (k = 0; k < 4; k++)
	{
		scanf("%d", &t[k]);
		getchar();
	}
	for (k = 0; k < 4; k++)
	{
		int Result = 0;
		if (t[k] <= 0 || t[k] >= 55)
		{
			printf("\n");
		}
		else
		{
			Num[0] = Max = t[k];
			for (i = 1; i < Max; i++)
			{
				if (t[k] - i - 3 > 0)
				{
					Num[i] = t[k] - i - 3;
				}
				else
				{
					Num[i] = 0;
				}
			}
			for (i = 0; i < Max; i++)
			{
				Result += Num[i];
			}
			printf("%d\n", Result);
		}
	}
	return 0;
}
为啥错了呀?
nnnnnnly 4年前 回复TA
@吃了一大碗呢 你这个在输出的时候  如果大于3他会 即输出2的结果 又输出0的结果 最后输出3的结果  嗯 应该吧
water 4年前 回复TA
@吃了一大碗呢 多组数据,输入0时停止
吃了一大碗呢 4年前 回复TA
#include<iostream>
#include<cstdlib>
using namespace std;
int Fab(int n)
{
	if(n==1) cout<<1<<endl;
	else if(n==2) cout<<2<<endl;
	else if(n==3) cout<<3<<endl;
	else 
	{
     return Fab(n-1)+Fab(n-3);
	}
}
int main()
{
   int n;
   cin>>n;
   if(n==1)
	   return 0;
   else
    cout << Fab(n) << endl;  
      system("pause");
    return 0;
}哪里错了呀
斤两 4年前 回复TA
#include<stdio.h>
int main ()
{
	int i,n;
	int a[55]={0,1,2,3};
	scanf("%d",&n);
	if(n==1)
		printf("%d\n",a[n]);
	else if(n==2)
		printf("%d\n",a[n]);
	else if(n==3)
		printf("%d\n",a[n]);
	else if(n==0)  
		printf(" ");	
	else
	{
		for(i=4;i<=n;i++)
		{
			a[i]=a[i-3]+a[i-1];
		}
		printf("%d\n",a[n]);
	}
	
	
}我这个有啥问题吗?答案显示我结果错误,但是运行结果是正确的啊