黑马程序员技术交流社区
标题:
面试题:农夫养牛问题
[打印本页]
作者:
HelloWorld_2013
时间:
2013-4-16 10:14
标题:
面试题:农夫养牛问题
本帖最后由 HelloWorld_2013 于 2013-4-17 09:14 编辑
一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。
作者:
陈圳
时间:
2013-4-16 11:48
本帖最后由 陈圳 于 2013-4-16 12:08 编辑
package exercises;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;
public class OtherCattle {
/**一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,
* 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。
* @param args
*/
public static void main(String[] args) {
System.out.println(new CattleField().getCount(13));
}
/*程序随机性比较强,我用测试语句测试到40时,发现有误.如果有兴趣,可以自行更改.因为他没有一个固定的值,公/母是随机的.
*/
}
class CattleField{//牛场,可以做得更形象,一个牛场,一个牛类,因为程序大体已经出来了.但是要学的东西多了,就不细分了.程序做出来就行了.
private int age=1;//如果是牛类,可以再加一个姓名属性,这样可以在下面程序中形象的打印,某某牛生什么性别的崽,叫什么,然后某某牛大于12,该去死了.
private String sex;
private int num;//隐含的牛编号
public static int cattleCount=1;
private static List<CattleField> cattle=new ArrayList<CattleField>();
CattleField(){
cattle.add(new CattleField(1,"母"));//农夫的第一头母牛
}
CattleField(int age,String sex){
this.num=cattleCount++;
this.age=age;
this.sex=sex;
}
public CattleField ageIncrease(){//年龄增加
this.age++;
return this;
}
public String getSex(){//获得新生牛的性别
if(new Random().nextInt(2)>0)
return "公";
else return "母";
}
public int getCount(int n){//获取多少年后,牧场的牛数
while(n>0){
/*for (ListIterator<CattleField> in = cattle.listIterator(); in.hasNext();) {//每过一年,牧场的牛,母牛超过3岁要生产,大于12的要挂掉
CattleField cte=in.next();
if (cte.sex == "母" && cte.age > 2) {
in.add(new CattleField(0, getSex()));// 出生了一头牛,性别是随机的
cattleCount++;
}
if(cte.age==12){//大于12岁,就让它去死;
in.remove();
}
cte.age++;
cte=in.previous();
in.set(cte);//这里替掉一下集合内的元素
}*/
//不用迭代器,涉及到修改元素时,有些费劲.直接用set与get来玩.
for(int i=0;i<cattle.size();i++){
if (cattle.get(i).sex == "母" && cattle.get(i).age > 2) {
cattle.add(new CattleField(0, getSex()));// 出生了一头牛,性别是随机的
}
if(cattle.get(i).age==12){//大于12岁,就让它去死;
System.out.println("第:"+cattle.remove(i).age+"头牛挂了");
cattleCount--;
}
//让每头牛的年龄都增加
CattleField tempCattle=cattle.get(i).ageIncrease();
cattle.set(i,tempCattle);
}
System.out.println(cattle);
n--;//年数减点;
}
/*for(Iterator<CattleField> in=cattle.iterator();in.hasNext();){
}*/
return cattle.size();//这里我返回这个数量有误,不找原因了.返回集合却是对的.
}
public String toString(){
return "第"+this.num+"头"+this.sex+"牛"+"年龄为:"+this.age;
}
}
复制代码
作者:
易杰
时间:
2013-4-16 12:43
package com.polaris.test;
import java.util.*;
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() + "头牛");
}
}
58.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;
}
//生出的小牛
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;
}
// 长大一岁,如果当前大于等于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;
}
}
作者:
王亚东
时间:
2013-4-16 20:34
我的程序结果在2 万左右,小至数千,多至5 ,6 万,不知合理不、
作者:
Sword
时间:
2013-4-17 00:07
解决这个问题要用到 数据结构与算法的知识,感觉要学习好算法,
给出的代码如下,可以验证一下对不对
package excise;
import java.util.ArrayList;
import java.util.List;
/**
* 问题描述:
*
* 一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,
* 在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,
* 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,
* 写出相关的代码或答题思路,最好用面向对象。
*
*/
public class ComputeCattles {
// 保存所有母牛
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);
for (int i = 0; i < 40; ++i) { // 40年
// 每年,所有的牛,大于等于12岁的牛送到屠宰场卖掉
for (int j = 0; j < cattles.size(); ++j) {
Cattle temp = cattles.get(j);
if (temp.getDead()) {
cattles.remove(temp);
}
// 所有牛都在长
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 {
private int sex;
private int age;
private boolean dead = false;
public Cattle() {
}
public Cattle(int sex, int age) {
this.sex = sex;
this.age = age;
}
public Cattle bear() {
Cattle calf = null;
if (this.sex == 0) {
calf = birth();
}
return calf;
}
private Cattle birth() {
Cattle calf = null;
if (this.age >= 3 && this.age <= 10) {
calf = new Cattle(random(), 0);
}
return calf;
}
private int random() {
return (int) Math.round(Math.random());
}
public void grow() {
this.age++;
}
public int getSex() {
return this.sex;
}
public boolean getDead() {
if (this.age >= 12)
dead = true;
return this.dead;
}
}
复制代码
作者:
不喝茶的陆羽
时间:
2013-6-4 20:28
面试题?是考试题吧?面试现场让你编程吗?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2