当前位置: 首页 > news >正文

「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只

http://www.xdnf.cn/news/1081135.html

相关文章:

  • [Linux]内核如何对信号进行捕捉
  • JavaWeb笔记05
  • 论文解读:《DeepGray:基于灰度图像和深度学习的恶意软件分类方法》
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • FastAPI 小白教程:从入门级到实战(源码教程)
  • 学习者的Python项目灵感
  • WPF 右键菜单 MenuItem 绑定图片时只显示最后一个 Icon
  • 【python实用小脚本-128】基于 Python 的 Hacker News 爬虫工具:自动化抓取新闻数据
  • 第二章-AIGC入门-开启AIGC音频探索之旅:从入门到实践(6/36)
  • 玩转n8n工作流教程(一):Windows系统本地部署n8n自动化工作流(n8n中文汉化)
  • 【基础算法】贪心 (二) :推公式
  • 基于大模型的强直性脊柱炎全周期预测与诊疗方案研究
  • 算法学习笔记:6.深度优先搜索算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 风平浪静、无事发生
  • 八股学习(三)---MySQL
  • 【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式
  • 类图+案例+代码详解:软件设计模式----原型模式
  • WPF+HelixToolkit打造炫酷自定义3D贴图立方体盒子模型
  • goole chrome变更默认搜索引擎为百度
  • 篇二 OSI七层模型,TCP/IP四层模型,路由器与交换机原理
  • SpringBoot-规划多模块目录结构
  • 从0开始学习R语言--Day38--辛普森多样性指数
  • Nuxt 3 面试题合集(中高级)
  • vue3 获取选中的el-table行数据
  • 浅谈 webshell 构造之如何获取恶意函数
  • 「AI产业」| 《中国信通院华为:智能体技术和应用研究报告》
  • Response对象
  • Excel 如何处理更复杂的嵌套逻辑判断?
  • 网安系列【4】之OWASP与OWASP Top 10:Web安全入门指南
  • Flink Vitess CDC 环境配置与验证