技术学习

C语言母牛问题

一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛。假设每次生的都是母牛,并且也遵守4年才能生育并生母牛的原则,并且无死亡,请问N年后共有过少头牛?

看到这个题目的时候 猛地想笑,这没有公牛,母牛能生小牛吗? 呵呵 不过这也仅仅是个问题而已 废话少说,开始正题。其实这是一类经典的题目,早在接触C语言的时候就有这种类型的题目,不过说的是兔子,在此小弟也将那个问题搬来了,做个参考:

有一兔子,从出生后第3个月起每个月都生一兔子。小兔子长到第3个月后每个月又生一兔子。假设所有兔子都不死,问每个月的兔子总是为多少?

可以从下表中看出兔子繁殖的规律:

第几个月小兔子数中兔子数老兔子数兔子总数
11001
20101
31012
41113
52125
63238
753513
…………………………

可以看到每个月的兔子总数依次为1,1,2,3,5,8,13……

C语言的解法如下:

#include "stdio.h"
void main()
{
    long int f1=1,f2=1;
    int i;
    for(i=1;i<=10;i++){  //前20天小鸡数
        printf("%5d%5d",f1,f2);
        if(i%2==0) printf("\n"); //四个数字一行
        f1=f1+f2;
        f2=f1+f2;
    }
}

至于运行结果,有兴趣的盆友可以自己运行一下。

小鸡问题其实就是斐波那契数列,需要注意的是循环10次其实输出是20个数。

可以从下表中看出小牛繁殖的规律:

第几年母牛第一阶段母牛第二阶段母牛第三阶段母牛生崽阶段母牛总数
110001
201001
300101
410012
511013
611114
721126
832139
9432413
10643619
11964928
1213961341
………………………………

可以看到每个月的兔子总数依次为1,1,1,2,3,4,6,9,13,19,28,41……

规律:从第四个月开始=>母牛数为 n-1年+ n-3年的数量 a[i]=a[i-1]+a[i-3]

#include "stdio.h"
void main()
{
    int i,a[21];
    a[1]=a[2]=a[3]=1;
    for(i=4;i<=20;i++){
        a[i]=a[i-1]+a[i-3];
    }
    printf("%d  ",a[20]);
}

看到这个问题头都大了,这个该怎么算,百度后发现列个表,很快就能找到数据,学好数学真的有用!

引用[1]=>https://wenku.baidu.com/view/9e4d4b38580216fc700afdca.html

程志辉
程志辉 前行的路充满未知,不努力尝试,永远都不知道有多精彩。

发表评论

已有 5 条评论
  1. 公式都有了,这题明显应该用递归啊。虽然所有的递归都可以变成循环。虽然递归要考虑栈溢出的问题。
    不过用递归面试的时候绝对是有加分的。
    int f (int n) {

    if ( n>=1 && n<=3) { return 1; } else { return f(n-1) + f(n-3); }

    }

  2. 这种数列应该可以通过杨辉三角解决吧!有了数学公式任何问题在计算机面前都不是问题,有技术的程序员更多的想到的是如何优化性能,就拿最简单的计算π举例子,优秀的程序可以瞬间计算出3.1415926小数点后面的几万个数字,这种能力也被常常用来衡量计算机的性能,您也姓程,祝您向着优秀的程序员迈进,加油!!!

    1. 谢谢,一定加油!

  3. 疯狂的母牛和兔子。。。
    这个应该属于奥数问题吧?

    1. 是啊,所以逻辑思维很重要~