面试题:农夫养牛问题

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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 @   polarisxu  阅读(519)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示