「Java案例」鸡兔同笼问题
案例解析
鸡兔同笼求解
《孙子算经》是中国古代重要的数学著作,成书于南北朝时期,其中就记载了一个有趣的问题:鸡和兔在同一个笼子里,鸡和兔共有n条腿, m个头,问鸡和兔各有多少只?编写一个程序实现鸡兔同笼问题。
# 源文件保存为“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*头数)/2int 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
- 鸡的数量就是总头数减去兔子的数量
- 验证结果是否合理(非负数且腿数计算正确)
- 输出结果或提示无解
枚举法求解
# 源文件保存为“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只
代码亮点:
- 使用枚举法逐个尝试可能的兔子数量
- 更直观,不需要数学推导
- 适合理解问题本质
- 可以轻松扩展到更多动物的情况
三元组问题(鸡兔鸭同笼)
# 源文件保存为“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条腿
- 输入头和腿的总数
- 计算蜘蛛和蚂蚁的数量
参考代码:
# 源文件保存为“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条腿
- 输入头和腿的总数
- 找出所有可能的动物组合
参考代码:
# 源文件保存为“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只