zoukankan      html  css  js  c++  java
  • 母牛的故事

    Description
      有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
    Input
      输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0< n< 55),n的含义如题目中描述。
      n=0表示输入数据的结束,不做处理。
    Output
      对于每个测试实例,输出在第n年的时候母牛的数量。
      每个输出占一行。
    Sample Input
    2
    4
    5
    0
    Sample Output
    2
    4
    6

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

    第n年:

    n=1

    n=2

    n=3

    n=4

    n=5

    n=6

    n=7

    n=8

    n=9

    fn头牛?

    f1=1

    f2=2

    f3=3

    f4=4

    f5=6

    f6=9

    f7=13

    f8=19

    f9=28

      在列出这个序列的过程中,应当能找出规律。

      以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年的数目,需要直接给出。
      很像斐波那契数列,有不一样之处,道理、方法一样。其实,在编程之前,讲究先用这样的方式建模。

      下面给出参考程序:

     //解法3:用数组

     1 //解法3:用数组
     2 #include <iostream>
     3 using namespace std;
     4 int main()
     5 {
     6     int n,i;
     7     int f[56]={0,1,2,3};
     8     for(i=4;i<=55;i++)
     9         f[i]=f[i-1]+f[i-3];
    10     while(cin>>n&&n!=0)
    11     {
    12         cout<<f[n]<<endl;
    13     }
    14     return 0;
    15 }
    View Code

    //解法1:迭代解法

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5 int n,i;
     6 int f1, f2, f3, fn;
     7 while(cin>>n&&n!=0)
     8 {
     9 //下面求第n年有几头牛
    10 f1=1;
    11 f2=2;
    12 f3=3;
    13 if(n==1)
    14 cout<<f1<<endl;
    15 else if(n==2)
    16 cout<<f2<<endl;
    17 else if(n==3)
    18 cout<<f3<<endl;
    19 else
    20 {
    21 for(i=4; i<=n; i++)
    22 {
    23 fn=f3+f1;
    24 f1=f2; //f1代表前3年
    25 f2=f3; //f2代表前2年
    26 f3=fn; //f3代表前1年
    27 }
    28 cout<<fn<<endl;
    29 }
    30 }
    31 return 0;
    32 }
    View Code

    //解法2:定义递归函数(效率低,不建议用)

     1 #include <iostream>
     2 using namespace std;
     3 int f(int n);
     4 int main()
     5 {
     6 int n;
     7 while(cin>>n&&n!=0)
     8 {
     9 cout<<f(n)<<endl;
    10 }
    11 return 0;
    12 }
    13 
    14 
    15 int f(int n)
    16 {
    17 if(n<4)
    18 return n; //第1,2,3年,各为1,2,3头
    19 else
    20 return f(n-1)+f(n-3); //第n年为前一年的和前3年的相加
    21 }
    View Code

     

     
  • 相关阅读:
    [www.infoshare.cc]【抓包工具】wireshark
    【抓包工具】fiddler4
    apktool参数详解
    [www.infoshare.cc]jarsigner参数详解
    [www.infoshare.cc]【编译反编译工具使用】
    [www.infoshare.cc]【重签名工具】re-signer.jar使用
    adb常用操作命令
    【uiautomator】Ant实现快速调试
    [www.infoshare.cc]【uiautomator】报告简介及查看
    【uiautomator】UiSelector
  • 原文地址:https://www.cnblogs.com/to-creat/p/4825573.html
Copyright © 2011-2022 走看看