面试题:农夫养牛问题

今天在群中,有人说到这个一个面试题:

一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。

polaris将代码(Java实现)写了一下,如有不对的地方欢迎指出。同时也欢迎您给出自己的解法。

package com.polaris.test;

import java.util.*;

/**
 * 问题描述:
 * 
 * 一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,
 * 在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,
 * 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,
 * 写出相关的代码或答题思路,最好用面向对象。
 * @author polaris http://www.beijixing001.com
 * @version 1.0
 */
public class ComputeCattleNum {
	
	// 保存所有母牛
	private static List<Cattle> cows = new ArrayList<Cattle>();
	
	// 保存所有当前农夫拥有的牛
	private static List<Cattle> cattles = new ArrayList<Cattle>();
	
	public static void main(String[] args) {
		// 第一头母牛
		Cattle cow = new Cattle(0,3);
		cows.add(cow);
		
		// 40年
		for(int i=0;i<40;++i) {
			// 大于等于12岁的牛送到屠宰场卖掉;同时每年,所有的牛
			for(int j=0;j<cattles.size();++j) {
				Cattle temp = cattles.get(j);
				if(temp.getDead()) {
					cattles.remove(temp);
				}
				
				// 开始只有一头母猪,年龄不生长
				if(i>0) {
					cattles.get(j).grow();
				}
			}
			
			// 母牛生小牛
			for(int j=0;j<cows.size();++j) {
				Cattle calf = cows.get(j).bear();
				if(calf!=null) {
					if(calf.getSex()==0)
						cows.add(calf);
					cattles.add(calf);
				}
			}
		}
		
		System.out.println("40年后农夫拥有" + cattles.size() + "头牛");
	}
}

class Cattle {
	
	// 牛的雌雄:0代表雌,1代表雄
	private int sex;
	// 牛的年龄
	private int age;
	// 是否卖掉(已死)
	private boolean dead = false;
	
	public Cattle(int sex, int age) {
		this.sex = sex;
		this.age = age;
	}
	
	/**
	 * 生小牛
	 * @return 生出的小牛
	 */
	public Cattle bear() {
		Cattle calf = null;
		if(this.sex==0) {
			if(this.age>=3 && this.age<=10) {
				calf = new Cattle(random(),0);
			} else {
				//System.out.println("抱歉,此牛太小或太老,不能生育。");
			}
		} else {
			//System.out.println("有没有搞错,公牛也想让它生小牛?");
		}
		return calf;
	}
	
	private int random() {
		return (int)Math.round(Math.random());
	}
	
	/**
	 * 长大一岁,如果当前大于等于12岁,则卖掉
	 */
	public void grow() {
		if(this.age>=12) dead = true;
		else this.age++;
	}
	
	public int getSex() {
		return this.sex;
	}
	
	public boolean getDead() {
		return this.dead;
	}
}
点击此处获得ComputeCattleNum.java类文件

posted @ 2010-10-01 14:23  polarisxu  阅读(518)  评论(0编辑  收藏  举报