伪君子


私信TA

用户名:lbj

访问量:89020

签 名:

我觉得吧,能实现就好^_^

等  级
排  名 44
经  验 11688
参赛次数 0
文章发表 23
年  龄 20
在职情况 学生
学  校 山西工程技术学院
专  业

  自我简介:

个人博客:https://lbjheiheihei.xyz 微信公众号:伪君子的梦呓


题目:



描述:

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 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;
}


 

0.0分

310 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#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]);
	}
	
	
}我这个有啥问题吗?答案显示我结果错误,但是运行结果是正确的啊
2020-04-03 15:17:03
#include<stdio.h>
int main(){
	int f1,f2,f3,fn,n,i;
//	f1=1;f2=2;f3=3;
	while(scanf("%d",&n)&&n!=0){
		f1=1;f2=2;f3=3;
		if(n==1)
			 printf("%d",f1);
		else if(n==2)
			 printf("%d",f2);
		else if(n==3)
			printf("%d",f3);
		else if(n>=4){
			for(i=4;i<=n;i++){
				fn=f1+f3;
				f1=f2;
				f2=f3;
				f3=fn;}
			printf("%d",fn);
		}}}
这个错哪里了啊 运行结果对 显示答案错误
2020-02-25 11:23:35
#include<stdio.h>
void main()
{int a=1,b=2,c=3,d,n;
scanf("%d",&n);
if(n!=0)
{
if(n==1)
printf("%d",a);	
else if(n==2)
printf("%d",b);
else if(n==3)
printf("%d",c);
else
{for(int i=4;i<=n;i++)
{d=a+c;

a=b;
b=c;c=d;}

printf("%d",d);
}}
else
printf("您输入的数据错误");

}
我这么写运行出来的结果没错啊,为什么系统说答案错误呢
2020-02-02 13:03:25
#include<stdio.h>
int main(){
	int all[56]={
		1,2,3,4
	};
	for(int i=4;i<56;i++){
		all[i]=all[i-1]+all[i-3];
	}
	while(true){
		int num;
		if(num==0){
			break;
		}
		scanf("%d",&num);
		printf("%d\n",all[num-1]);
	}
	return 0;
}
2020-01-22 17:29:45
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n,a[100]={0,1,2,3},sum=0,i;
	scanf("%d",&n);
	for(i=4;i<=n;i++)
	{
	sum=a[i-1]+a[i-3];
	a[i]=sum;
}
printf("%d",sum);

	return 0;
}
2020-01-20 10:21:12
为什么不能用递归?
2020-01-08 14:29:40
好方法
2019-10-01 20:46:59
f(n) = f(n - 1) + f(n - 3) 的规律可以用数学化一点的推导公式吗?直接由前面几个得到规律有点看不懂。
2019-09-09 21:23:45