「Java案例」鸡兔同笼问题

案例解析

鸡兔同笼求解

《孙子算经》是中国古代重要的数学著作,成书于南北朝时期,其中就记载了一个有趣的问题:鸡和兔在同一个笼子里,鸡和兔共有n条腿, m个头,问鸡和兔各有多少只?编写一个程序实现鸡兔同笼问题。

java 复制代码
# 源文件保存为"ChickenRabbitCage.java"
import java.util.Scanner;

public class ChickenRabbitCage {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入头的总数:");
        int heads = scanner.nextInt();
        
        System.out.print("请输入腿的总数:");
        int legs = scanner.nextInt();
        
        // 计算兔子的数量:(腿数 - 2*头数)/2
        int rabbits = (legs - 2 * heads) / 2;
        int chickens = heads - rabbits;
        
        // 验证结果是否合理
        if(rabbits >= 0 && chickens >= 0 && (2*chickens + 4*rabbits) == legs) {
            System.out.println("鸡有" + chickens + "只");
            System.out.println("兔有" + rabbits + "只");
        } else {
            System.out.println("无解,请检查输入数据是否合理");
        }
        
        scanner.close();
    }
}

运行示例:

输入头的总数10 ,腿的总数32

请输入头的总数:10

请输入腿的总数:32

鸡有4只

兔有6只

代码解析:

  • 使用Scanner获取用户输入的头和腿的数量
  • 根据数学公式计算兔子的数量:rabbits = (legs - 2*heads)/2
  • 鸡的数量就是总头数减去兔子的数量
  • 验证结果是否合理(非负数且腿数计算正确)
  • 输出结果或提示无解

枚举法求解

java 复制代码
# 源文件保存为"EnumerationSolution.java"
import java.util.Scanner;

public class EnumerationSolution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入头的总数:");
        int heads = scanner.nextInt();
        
        System.out.print("请输入腿的总数:");
        int legs = scanner.nextInt();
        
        boolean found = false;
        for(int rabbits = 0; rabbits <= heads; rabbits++) {
            int chickens = heads - rabbits;
            if(2*chickens + 4*rabbits == legs) {
                System.out.println("鸡有" + chickens + "只");
                System.out.println("兔有" + rabbits + "只");
                found = true;
                break;
            }
        }
        
        if(!found) {
            System.out.println("无解,请检查输入数据是否合理");
        }
        
        scanner.close();
    }
}

运行示例:

输入头的总数10 ,腿的总数32

请输入头的总数:10

请输入腿的总数:32

鸡有4只

兔有6只

代码亮点:

  • 使用枚举法逐个尝试可能的兔子数量
  • 更直观,不需要数学推导
  • 适合理解问题本质
  • 可以轻松扩展到更多动物的情况

三元组问题(鸡兔鸭同笼)

java 复制代码
# 源文件保存为"ThreeAnimals.java"
import java.util.Scanner;

public class ThreeAnimals {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入头的总数:");
        int heads = scanner.nextInt();
        
        System.out.print("请输入腿的总数:");
        int legs = scanner.nextInt();
        
        System.out.print("请输入鸭子的数量(已知):");
        int ducks = scanner.nextInt();
        
        int remainingHeads = heads - ducks;
        int remainingLegs = legs - 2 * ducks;
        
        if(remainingHeads < 0 || remainingLegs < 0) {
            System.out.println("鸭子数量输入不合理");
            return;
        }
        
        int rabbits = (remainingLegs - 2 * remainingHeads) / 2;
        int chickens = remainingHeads - rabbits;
        
        if(rabbits >= 0 && chickens >= 0 && 
           (2*chickens + 4*rabbits + 2*ducks) == legs) {
            System.out.println("鸡有" + chickens + "只");
            System.out.println("兔有" + rabbits + "只");
            System.out.println("鸭有" + ducks + "只");
        } else {
            System.out.println("无解,请检查输入数据是否合理");
        }
        
        scanner.close();
    }
}

运行结果

输入头的总数10 ,腿的总数32 ,鸭子数量3

请输入头的总数:12

请输入腿的总数:32

请输入鸭子的数量(已知):3

鸡有5只

兔有4只

鸭有3只

代码亮点:

  • 扩展原问题,增加鸭子
  • 展示了如何逐步解决更复杂的问题
  • 需要先减去已知动物的影响
  • 更贴近实际应用场景

操作练习题

蜘蛛蚂蚁问题

要求:

  • 笼子里有蜘蛛和蚂蚁
  • 蜘蛛8条腿,蚂蚁6条腿
  • 输入头和腿的总数
  • 计算蜘蛛和蚂蚁的数量

参考代码:

java 复制代码
# 源文件保存为"SpiderAnt.java"
import java.util.Scanner;

public class SpiderAnt {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入头的总数:");
        int heads = scanner.nextInt();
        
        System.out.print("请输入腿的总数:");
        int legs = scanner.nextInt();
        
        int spiders = (legs - 6 * heads) / 2;
        int ants = heads - spiders;
        
        if(spiders >= 0 && ants >= 0 && (8*spiders + 6*ants) == legs) {
            System.out.println("蜘蛛有" + spiders + "只");
            System.out.println("蚂蚁有" + ants + "只");
        } else {
            System.out.println("无解,请检查输入数据是否合理");
        }
        
        scanner.close();
    }
}

运行结果

输入头的总数5 ,腿的总数34

请输入头的总数:5

请输入腿的总数:34

蜘蛛有2只

蚂蚁有3只

多解情况处理

要求:

  • 笼子里有鸡、兔和羊
  • 鸡2条腿,兔4条腿,羊4条腿
  • 输入头和腿的总数
  • 找出所有可能的动物组合

参考代码:

java 复制代码
# 源文件保存为"MultipleSolutions.java"
import java.util.Scanner;

public class MultipleSolutions {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入头的总数:");
        int heads = scanner.nextInt();
        
        System.out.print("请输入腿的总数:");
        int legs = scanner.nextInt();
        
        System.out.println("可能的组合:");
        boolean found = false;
        
        for(int sheep = 0; sheep <= heads; sheep++) {
            for(int rabbits = 0; rabbits <= heads - sheep; rabbits++) {
                int chickens = heads - sheep - rabbits;
                if(2*chickens + 4*rabbits + 4*sheep == legs) {
                    System.out.printf("鸡%d只,兔%d只,羊%d只\n", chickens, rabbits, sheep);
                    found = true;
                }
            }
        }
        
        if(!found) {
            System.out.println("无解,请检查输入数据是否合理");
        }
        
        scanner.close();
    }
}

运行结果

输入头的总数8 和腿的总数18

请输入头的总数:8

请输入腿的总数:18

可能的组合:

鸡7只,兔1只,羊0只

鸡7只,兔0只,羊1只