一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛。假设每次生的都是母牛,并且也遵守4年才能生育并生母牛的原则,并且无死亡,请问N年后共有过少头牛?
看到这个题目的时候 猛地想笑,这没有公牛,母牛能生小牛吗? 呵呵 不过这也仅仅是个问题而已 废话少说,开始正题。其实这是一类经典的题目,早在接触C语言的时候就有这种类型的题目,不过说的是兔子,在此小弟也将那个问题搬来了,做个参考:
有一兔子,从出生后第3个月起每个月都生一兔子。小兔子长到第3个月后每个月又生一兔子。假设所有兔子都不死,问每个月的兔子总是为多少?
可以从下表中看出兔子繁殖的规律:
第几个月 | 小兔子数 | 中兔子数 | 老兔子数 | 兔子总数 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 1 | 2 | 5 |
6 | 3 | 2 | 3 | 8 |
7 | 5 | 3 | 5 | 13 |
…… | …… | …… | …… | …… |
可以看到每个月的兔子总数依次为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个数。
可以从下表中看出小牛繁殖的规律:
第几年 | 母牛第一阶段 | 母牛第二阶段 | 母牛第三阶段 | 母牛生崽阶段 | 母牛总数 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 0 | 1 |
3 | 0 | 0 | 1 | 0 | 1 |
4 | 1 | 0 | 0 | 1 | 2 |
5 | 1 | 1 | 0 | 1 | 3 |
6 | 1 | 1 | 1 | 1 | 4 |
7 | 2 | 1 | 1 | 2 | 6 |
8 | 3 | 2 | 1 | 3 | 9 |
9 | 4 | 3 | 2 | 4 | 13 |
10 | 6 | 4 | 3 | 6 | 19 |
11 | 9 | 6 | 4 | 9 | 28 |
12 | 13 | 9 | 6 | 13 | 41 |
…… | …… | …… | …… | …… | …… |
可以看到每个月的兔子总数依次为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
公式都有了,这题明显应该用递归啊。虽然所有的递归都可以变成循环。虽然递归要考虑栈溢出的问题。
if ( n>=1 && n<=3) { return 1; } else { return f(n-1) + f(n-3); }不过用递归面试的时候绝对是有加分的。
int f (int n) {
}
这种数列应该可以通过杨辉三角解决吧!有了数学公式任何问题在计算机面前都不是问题,有技术的程序员更多的想到的是如何优化性能,就拿最简单的计算π举例子,优秀的程序可以瞬间计算出3.1415926小数点后面的几万个数字,这种能力也被常常用来衡量计算机的性能,您也姓程,祝您向着优秀的程序员迈进,加油!!!
谢谢,一定加油!
疯狂的母牛和兔子。。。
这个应该属于奥数问题吧?
是啊,所以逻辑思维很重要~