落花四月


私信TA

用户名:LSYC

访问量:32910

签 名:

等  级
排  名 538
经  验 4439
参赛次数 2
文章发表 34
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

注意事项:

参考代码:


 题目分析


根据题意,先列出前几年的牛头数,试着找找规律:

TIM截图20181207173845.png
在列出这个序列的过程中,应当能找出规律。

以n=6为例,fn=9头牛可以分解为6+3,其中6是上一年(第5年)的牛,3是新生的牛(因为第3年有3头牛,这3头在第6年各生一头牛)。

我们可以得出这样一个公式:fn=fn-1+fn-3。再理解一下,fn-1是前一年的牛,第n年仍然在,fn-3是前三年那一年的牛,

但换句话说也就是第n年具有生育能力的牛,也就是第n年能生下的小牛数。编程序,求解这个公式就行了。

当然,第1-3年的数目,需要直接给出。很像斐波那契数列,有不一样之处,道理、方法一样。其实,在编程之前,讲究先用这样的方式建模。

**迭代法求解**

    #include <iostream>
    using namespace std;
    int main() {
        int n,i;
        int f1, f2, f3, fn;
        while(cin>>n&&n!=0) {
            //下面求第n年有几头牛
            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;
            }
        }
        return 0;
    }




**数组求解**

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        int n,f[56]= {0,1,2,3};
        for(int i=4; i<=55; i++) {
            f[i]=f[i-1]+f[i-3];
        }
        while(cin>>n&&n!=0) {
            cout<<f[n]<<endl;
        }
        return 0;
    }


 

0.0分

80 人评分

  评论区

#include<stdio.h>
int main()
{
    int n,x;
    scanf("%d",&n)''
    if(n=0)
    return false;
    if(n<4)
    x=1;
    if(n>=4)
    x=n-2;
    printf("%d",x)
    return 0;
}
这种可以吗
2021-02-10 13:15:56
#include<iostream>
using namespace std;

int cow(int i) {         //返回第i年母牛总数
    if (i <= 4)
        return i == 0 ? 0 : i;
    else
        return (cow(i - 1) + cow(i - 3));
}

int main()
{
    int i;
    while (cin >> i) {
        if (i == 0)        //若输入为0则跳出循环
            break;
        else
            cout << cow(i) << endl;
    }
    return 0;
}

结果是对的, 就是时间超了. 就当辅助理解递归把.. 看一乐..
2020-11-19 22:38:23
#include<stdio.h>
int main()
{
    int a;
    int i;
    int f[55]={0,1,2,3};
   
    for(i=4;i<55;i++){	
       f[i]=f[i-1]+f[i-3];
    }
    scanf("%d",&a);		
    if(a<55&&a!=0){	
	   printf("%d\n",f[a]); 
    }

    return 0;
}
哪里错了呢,欲哭无泪
2020-04-02 15:34:17
我想问一个很蠢的问题: 第八年的时候,不是有5个可以生育的大奶牛吗? 再加上前面的13,等于18,我前面按照这个思路计算正常,一到第八年就错了,请问是什么原因?
2020-02-13 20:32:48
#include<stdio.h>
int main()
{
	int nb(int n);
	int n,c; 
	scanf("%d",&n);
	c=nb(n);
	printf("%d",c);
	return 0;

}
int nb(int n){
	int c;
	if(n==1)
	  c=1;
	else if(n==2)
	   c=2;
	else if(n==3)
	   c=3;
	else
	   c=nb(n-1)+nb(n-3);
	return c;
}  
为啥显示结果错误呢,求解惑
2019-12-14 11:47:53
谢谢谢谢很详细了
2019-10-01 20:49:15
#include<iostream>
using namespace std;
int count(int *a,int i,int n){
	int sum=0;
	a[i]=a[i-1]+a[i-3];
	sum+=a[i];
	i++; 
	if(i==n) return sum;
	else return count(a,i,n);
}
int main(){
	int a[100]={1,2,3,4},n;
	while(cin>>n&&n!=0){
	int sum;
	if(n==4) cout<<a[3]<<endl;
	else if(n==3) cout<<a[2]<<endl;
	else if(n==2) cout<<a[1]<<endl;
	else if(n==1) cout<<a[0]<<endl;
	else{
		sum=count(a,4,n);
	cout<<sum<<endl;	
	}		
	}
	return 0;
}

不知道还有没有人看评论  我的一直报错答案错误,可是我试了一下上面的程序,答案一样啊,有人帮忙解答一下吗
2019-07-16 16:31:06
大佬nb 思路清晰 刚刚看了斐波那契数列 和这个差不多 n年的牛=n-1年的牛+n-3年的牛
2019-06-30 23:35:38