黑马程序员技术交流社区

标题: 面试题:农夫养牛问题 [打印本页]

作者: 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 编辑
  1. package exercises;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.ListIterator;
  6. import java.util.Random;

  7. public class OtherCattle {

  8.         /**一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,
  9.          * 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。
  10.          * @param args
  11.          */
  12.         public static void main(String[] args) {
  13.                 System.out.println(new CattleField().getCount(13));
  14.         }
  15.         /*程序随机性比较强,我用测试语句测试到40时,发现有误.如果有兴趣,可以自行更改.因为他没有一个固定的值,公/母是随机的.
  16.          */

  17. }
  18. class CattleField{//牛场,可以做得更形象,一个牛场,一个牛类,因为程序大体已经出来了.但是要学的东西多了,就不细分了.程序做出来就行了.
  19.         private int age=1;//如果是牛类,可以再加一个姓名属性,这样可以在下面程序中形象的打印,某某牛生什么性别的崽,叫什么,然后某某牛大于12,该去死了.
  20.         private String sex;
  21.         private int num;//隐含的牛编号
  22.         public static int cattleCount=1;
  23.         private static List<CattleField> cattle=new ArrayList<CattleField>();
  24.         CattleField(){
  25.                 cattle.add(new CattleField(1,"母"));//农夫的第一头母牛
  26.         }
  27.         CattleField(int age,String sex){
  28.                 this.num=cattleCount++;
  29.                 this.age=age;
  30.                 this.sex=sex;
  31.         }
  32.         public CattleField ageIncrease(){//年龄增加
  33.                         this.age++;
  34.                 return this;
  35.         }
  36.         public String getSex(){//获得新生牛的性别
  37.                 if(new Random().nextInt(2)>0)
  38.                         return "公";
  39.                 else return "母";
  40.         }
  41.         public  int getCount(int n){//获取多少年后,牧场的牛数
  42.                 while(n>0){
  43.                         /*for (ListIterator<CattleField> in = cattle.listIterator(); in.hasNext();) {//每过一年,牧场的牛,母牛超过3岁要生产,大于12的要挂掉
  44.                                 CattleField cte=in.next();
  45.                                 if (cte.sex == "母" && cte.age > 2) {
  46.                                         in.add(new CattleField(0, getSex()));// 出生了一头牛,性别是随机的
  47.                                         cattleCount++;
  48.                                 }
  49.                                 if(cte.age==12){//大于12岁,就让它去死;
  50.                                         in.remove();
  51.                                 }
  52.                                 cte.age++;
  53.                                 cte=in.previous();
  54.                                 in.set(cte);//这里替掉一下集合内的元素
  55.                         }*/
  56.                         //不用迭代器,涉及到修改元素时,有些费劲.直接用set与get来玩.
  57.                         for(int i=0;i<cattle.size();i++){
  58.                                 if (cattle.get(i).sex == "母" && cattle.get(i).age > 2) {
  59.                                         cattle.add(new CattleField(0, getSex()));// 出生了一头牛,性别是随机的
  60.                                 }
  61.                                 if(cattle.get(i).age==12){//大于12岁,就让它去死;
  62.                                         System.out.println("第:"+cattle.remove(i).age+"头牛挂了");
  63.                                         cattleCount--;
  64.                                 }
  65.                                 //让每头牛的年龄都增加
  66.                                 CattleField tempCattle=cattle.get(i).ageIncrease();
  67.                                 cattle.set(i,tempCattle);
  68.                         }
  69.                         System.out.println(cattle);
  70.                         n--;//年数减点;
  71.                 }
  72.                 /*for(Iterator<CattleField> in=cattle.iterator();in.hasNext();){
  73.                         
  74.                 }*/
  75.                 return cattle.size();//这里我返回这个数量有误,不找原因了.返回集合却是对的.
  76.         }
  77.         public String toString(){
  78.                 return "第"+this.num+"头"+this.sex+"牛"+"年龄为:"+this.age;
  79.         }
  80. }
复制代码

作者: 易杰    时间: 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
解决这个问题要用到 数据结构与算法的知识,感觉要学习好算法,

给出的代码如下,可以验证一下对不对
  1. package excise;

  2. import java.util.ArrayList;
  3. import java.util.List;

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

  13. public class ComputeCattles {
  14.         // 保存所有母牛
  15.         private static List<Cattle> cows = new ArrayList<Cattle>();

  16.         // 保存所有当前农夫拥有的牛
  17.         private static List<Cattle> cattles = new ArrayList<Cattle>();

  18.         public static void main(String[] args) {
  19.                 // 第一头母牛
  20.                 Cattle cow = new Cattle(0, 3);
  21.                 cows.add(cow);

  22.                 for (int i = 0; i < 40; ++i) {                // 40年
  23.                         // 每年,所有的牛,大于等于12岁的牛送到屠宰场卖掉
  24.                         for (int j = 0; j < cattles.size(); ++j) {
  25.                                 Cattle temp = cattles.get(j);
  26.                                 if (temp.getDead()) {
  27.                                         cattles.remove(temp);
  28.                                 }
  29.                                 // 所有牛都在长
  30.                                 cattles.get(j).grow();
  31.                         }

  32.                         // 一头母牛生一头小牛
  33.                         for (int j = 0; j < cows.size(); ++j) {
  34.                                 Cattle calf = cows.get(j).bear();
  35.                                 if (calf != null) {
  36.                                         if (calf.getSex() == 0)
  37.                                                 cows.add(calf);
  38.                                         cattles.add(calf);
  39.                                 }
  40.                         }
  41.                 }
  42.                 System.out.println("40年后农夫可能拥有" + cattles.size() + "头牛");
  43.         }
  44. }

  45. class Cattle {
  46.         private int sex;
  47.         private int age;

  48.         private boolean dead = false;

  49.         public Cattle() {
  50.         }

  51.         public Cattle(int sex, int age) {
  52.                 this.sex = sex;
  53.                 this.age = age;
  54.         }

  55.         public Cattle bear() {
  56.                 Cattle calf = null;
  57.                 if (this.sex == 0) {
  58.                         calf = birth();
  59.                 }
  60.                 return calf;
  61.         }
  62.        
  63.         private Cattle birth() {
  64.                 Cattle calf = null;
  65.                 if (this.age >= 3 && this.age <= 10) {
  66.                         calf = new Cattle(random(), 0);
  67.                 }
  68.                 return calf;
  69.         }

  70.         private int random() {
  71.                 return (int) Math.round(Math.random());
  72.         }

  73.         public void grow() {
  74.                 this.age++;
  75.         }

  76.         public int getSex() {
  77.                 return this.sex;
  78.         }

  79.         public boolean getDead() {
  80.                 if (this.age >= 12)
  81.                         dead = true;
  82.                 return this.dead;
  83.         }

  84. }
复制代码

作者: 不喝茶的陆羽    时间: 2013-6-4 20:28
面试题?是考试题吧?面试现场让你编程吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2