落花四月


私信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 人评分

  评论区

这是不是c啊
2019-04-23 18:59:54
c++。。。。
2019-04-02 19:00:06
#include<stdio.h>
int main()
{
    int a=1;
    int n;
    while(scanf("%d", &n)!=0){
    if (n>0&&n<=4)
    a=+n;
    if (n>4)
    a=+3+(n-2)*(n-3)/2;
    printf("%d\n",a);}
    return 0;
}
我这个为啥不行啊,没搞明白
2019-03-13 09:12:33
第二种方法真的可以,编者厉害,卧槽卧槽
2019-02-25 20:51:48
第一年不是有两只吗?母牛加它生的小牛。。。
2019-01-18 19:21:51
第四年我感觉应该是5头牛了
2019-01-08 10:19:21
看不懂
2018-12-20 10:36:46