日期:2014-05-19  浏览次数:20748 次

母鸡算法
有一道题:
有一只母鸡,每月生一只小母鸡,小母鸡长到每第四个月后每月又生一只小小母鸡,问20个月后母鸡的总数为多少?
写一个程程序解决这个问题 


刚遇到的难题, 求一个合适的解决方案, 附代码。

------解决方案--------------------
一般有两种方法:
1. 笨办法,计下所有的鸡
2. 找数学规律
[code=Jav]import java.util.ArrayList;
import java.util.List;

public class HenGrow {
  public static void main(String[] args) {
    final int month = 20;
    // 方法1: 记录所有的鸡
    List <Integer> hen1 = new ArrayList <Integer>();
    hen1.add(100);

    for (int i = 1; i <= month; ++i) {
      int size = hen1.size();
      for (int j = 0; j < size; ++j) {
        hen1.set(j, hen1.get(j) + 1);
        if (hen1.get(j) >= 4) {
          hen1.add(0);
        }
      }
    }

    System.out.println(hen1.size());

    // 方法2: 本月的鸡数为上一个月的鸡数 + 前4个月的鸡数 (可以生小鸡了,不过鸡好像不是生出来的)
    List <Integer> hen2 = new ArrayList <Integer>();
    hen2.add(2); // 第一个月有2只鸡: 母鸡+生的一只小鸡
    hen2.add(3); // 第二个月有3只鸡
    hen2.add(4); // 第三个月有4只鸡
    hen2.add(5); // 第四个月有5只鸡

    // 从第五个月开始,第一个月生的小鸡可以生小鸡鸡了
    for (int i = 5; i <= month; ++i) {
      hen2.add(hen2.get(i - 1 - 1) + hen2.get(i - 1 - 4));
    }
    System.out.println(hen2.get(month - 1));
  }
}[/code]
------解决方案--------------------
答案就是 2745.。

想起我以前做过的一道非常类似的,只是用C语言描述的:

题目:
有一头母牛,从出生起第四个年头开始每年生一头母牛,第n年几头?

[code=Jav]
#include <stdio.h>
void main()
{
/*y1表示1岁,y2...,y3..没有y4,是因为到了第四年,就可以生了,所以身份是母亲*/
int sum,mother=1,y1,y2,y3,n;
printf("Enter the Year(n)=: ");
scanf("%d",&n);
if(0 <n&&n <4) sum=n;
if(n>=4)
{
for(y1=1,y2=1,y3=1;n>=4;n--)//第6年后,刚好y1,y2,y3都为1。此后每过一年...
{
mother=mother+y3; //三岁的变成母亲。
y3=y2; //2岁的成了三岁
y2=y1; //1岁的--->二岁
y1=mother; //所有的母亲每一年都生下小牛(y1)
sum=mother+y1+y2+y3;
}
}
printf("Sum = %d\n",sum);
}

[/code]

09年前写的 母牛四年生一只...
几本都一样的。