Java实战:机票计算与素数判断算法解析
1. 项目概述Java实战编程的典型场景今天咱们聊聊Java编程中两个非常典型的实战场景机票价格计算系统和素数判断算法。这两个案例看似简单却涵盖了Java基础语法、面向对象思想、算法逻辑等核心知识点是检验Java基本功的绝佳试金石。机票计算系统涉及到用户输入处理、条件判断、浮点数运算等基础但关键的编程技能。而素数判断则考验我们对算法效率的理解和优化能力。这两个案例经常出现在Java初级面试题中也是很多培训机构的教学案例因为它们能很好地展示一个程序员的基础编码能力。提示虽然这些案例看起来基础但很多工作3年以上的开发者在白板编程时仍然会犯低级错误比如忽略边界条件或算法效率问题。2. 机票价格计算系统实现2.1 需求分析与设计思路机票价格计算需要考虑以下几个核心因素基础票价由航线决定燃油附加费固定或按比例机场建设费固定费用折扣率根据购票时间、舱位等变化节假日溢价如春节、国庆等一个健壮的机票计算系统应该能够处理各种异常情况比如非法的票价输入负数或非数字超出合理范围的折扣率特殊乘客儿童、婴儿、老人的优惠政策2.2 核心代码实现import java.util.Scanner; public class TicketPriceCalculator { // 常量定义 private static final double FUEL_SURCHARGE 120.0; private static final double AIRPORT_TAX 50.0; public static void main(String[] args) { Scanner scanner new Scanner(System.in); System.out.print(请输入基础票价: ); double basePrice scanner.nextDouble(); System.out.print(请输入折扣率(0.1-1.0): ); double discount scanner.nextDouble(); System.out.print(是否为节假日(1-是, 0-否): ); int isHoliday scanner.nextInt(); // 输入验证 if(basePrice 0 || discount 0.1 || discount 1.0) { System.out.println(输入参数不合法); return; } // 计算逻辑 double holidaySurcharge isHoliday 1 ? basePrice * 0.2 : 0; double finalPrice (basePrice * discount) FUEL_SURCHARGE AIRPORT_TAX holidaySurcharge; System.out.printf(最终票价为: %.2f元\n, finalPrice); } }2.3 代码优化与异常处理上面的基础版本有几个明显的问题需要优化输入验证不够全面没有考虑多种舱位类型节假日溢价逻辑过于简单缺乏对特殊乘客的考虑改进后的版本应该增加这些功能// 舱位类型枚举 enum CabinClass { ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST } // 乘客类型枚举 enum PassengerType { ADULT, CHILD, INFANT, SENIOR } public class EnhancedTicketCalculator { // 更精细化的费用计算 public double calculateTicketPrice(double basePrice, CabinClass cabin, PassengerType passenger, boolean isHoliday) { // 参数校验 if(basePrice 0) { throw new IllegalArgumentException(基础票价必须大于0); } // 舱位系数 double cabinFactor getCabinFactor(cabin); // 乘客折扣 double passengerDiscount getPassengerDiscount(passenger); // 节假日溢价 double holidaySurcharge isHoliday ? basePrice * 0.25 : 0; return (basePrice * cabinFactor * passengerDiscount) getFixedFees(cabin) holidaySurcharge; } // 其他辅助方法... }3. 素数判断算法实现3.1 素数基础概念与判断方法素数是指大于1的自然数中除了1和它本身外不能被其他自然数整除的数。判断一个数是否为素数有多种方法我们从最简单的方法开始逐步优化。最直观的判断方法是试除法对于给定的数n检查2到n-1之间的所有整数是否能整除n。如果都不能则n是素数。public static boolean isPrimeBasic(int n) { if(n 1) return false; for(int i 2; i n; i) { if(n % i 0) return false; } return true; }这个方法虽然正确但效率极低时间复杂度是O(n)。3.2 算法优化思路我们可以通过数学观察来优化算法只需要检查到√n即可如果n不是素数那么它一定有一个因数小于等于√n跳过偶数除了2所有偶数都不是素数预先生成素数表对于多次判断的情况可以使用埃拉托斯特尼筛法优化后的算法public static boolean isPrimeOptimized(int n) { if(n 1) return false; if(n 2) return true; if(n % 2 0) return false; for(int i 3; i * i n; i 2) { if(n % i 0) return false; } return true; }这个版本的时间复杂度降到了O(√n)效率大幅提升。3.3 埃拉托斯特尼筛法实现如果需要频繁判断多个数是否为素数可以使用筛法预先计算public static boolean[] sieveOfEratosthenes(int max) { boolean[] isPrime new boolean[max 1]; Arrays.fill(isPrime, true); isPrime[0] isPrime[1] false; for(int i 2; i * i max; i) { if(isPrime[i]) { for(int j i * i; j max; j i) { isPrime[j] false; } } } return isPrime; }这种方法特别适合需要多次查询素数的情况预处理后每次查询只需O(1)时间。4. 验证码生成与校验4.1 简单数字验证码生成验证码是Web开发中常见的功能用于防止机器人攻击。我们来实现一个简单的数字验证码生成器import java.util.Random; public class CaptchaGenerator { private static final String NUMBERS 0123456789; private static final int LENGTH 6; public static String generate() { Random random new Random(); StringBuilder sb new StringBuilder(); for(int i 0; i LENGTH; i) { int index random.nextInt(NUMBERS.length()); sb.append(NUMBERS.charAt(index)); } return sb.toString(); } public static boolean validate(String input, String captcha) { return input ! null input.equals(captcha); } }4.2 增强型验证码实现更安全的验证码应该包含字母和数字并且区分大小写public class EnhancedCaptcha { private static final String CHAR_SET ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789; private static final int LENGTH 8; public static String generate() { SecureRandom random new SecureRandom(); StringBuilder sb new StringBuilder(); for(int i 0; i LENGTH; i) { int index random.nextInt(CHAR_SET.length()); sb.append(CHAR_SET.charAt(index)); } return sb.toString(); } // 添加验证码过期时间检查 public static boolean validate(String input, String captcha, long generateTime) { long currentTime System.currentTimeMillis(); long expireTime generateTime (5 * 60 * 1000); // 5分钟有效期 if(currentTime expireTime) { return false; } return input ! null input.equals(captcha); } }4.3 验证码图片生成真正的验证码通常以图片形式呈现防止简单的OCR识别import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; public class ImageCaptcha { private static final int WIDTH 200; private static final int HEIGHT 80; public static BufferedImage generateImageCaptcha(String code) { BufferedImage image new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g image.createGraphics(); // 设置背景色 g.setColor(Color.WHITE); g.fillRect(0, 0, WIDTH, HEIGHT); // 添加干扰线 Random random new Random(); for(int i 0; i 20; i) { int x1 random.nextInt(WIDTH); int y1 random.nextInt(HEIGHT); int x2 random.nextInt(WIDTH); int y2 random.nextInt(HEIGHT); g.setColor(getRandomColor()); g.drawLine(x1, y1, x2, y2); } // 绘制验证码 g.setFont(new Font(Arial, Font.BOLD, 40)); for(int i 0; i code.length(); i) { g.setColor(getRandomColor()); g.drawString(String.valueOf(code.charAt(i)), 30 * i 20, 50); } g.dispose(); return image; } private static Color getRandomColor() { Random random new Random(); return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); } }5. 实战经验与常见问题5.1 机票计算系统的注意事项浮点数精度问题Java中的double类型在进行货币计算时可能会有精度损失。对于金融类计算建议使用BigDecimalBigDecimal basePrice new BigDecimal(1000.00); BigDecimal discount new BigDecimal(0.85); BigDecimal finalPrice basePrice.multiply(discount) .add(new BigDecimal(120.00)) .add(new BigDecimal(50.00));多线程安全问题如果机票计算系统需要处理高并发请求要注意线程安全问题。避免使用共享的可变状态或者使用适当的同步机制。配置化管理燃油附加费、机场建设费等经常变动的参数应该从配置文件中读取而不是硬编码在代码中。5.2 素数算法的性能考量大数判断对于非常大的数如超过10^8即使是优化后的试除法也会很慢。这时可以考虑概率性测试算法如Miller-Rabin测试。缓存优化如果应用需要频繁判断素数可以预先生成素数表并缓存结果。并行计算对于非常大的范围如找出1到10^8之间的所有素数可以考虑将范围分割并并行处理。5.3 验证码系统的安全建议会话管理验证码应该与用户会话绑定防止CSRF攻击。使用安全随机数java.util.Random不够安全应该使用java.security.SecureRandom。限制尝试次数防止暴力破解应该限制单位时间内的验证尝试次数。前端混淆避免直接将验证码以明文形式返回给前端可以考虑分多次请求或添加混淆逻辑。我在实际项目中遇到过验证码被OCR破解的情况后来通过增加干扰线、扭曲文字、背景噪点等措施显著提高了安全性。另一个常见问题是验证码过期时间设置不当要么太短影响用户体验要么太长降低安全性通常5分钟是一个比较合理的折中方案。

相关新闻

基于Spring Boot的高考志愿智能推荐系统设计与实践

基于Spring Boot的高考志愿智能推荐系统设计与实践

1. 项目背景与核心价值高考志愿填报是每个考生家庭面临的重要决策,传统方式依赖人工收集院校信息、比对历年分数线,存在信息不对称、决策效率低等问题。我们团队基于Spring Boot框架开发的智能志愿推荐系统,整合了全国2800余所高校的招生数据…

2026/10/19 1:36:00 阅读更多 →
Python+Django+SSM构建智能健康检测系统架构解析

Python+Django+SSM构建智能健康检测系统架构解析

1. 项目概述:智能健康检测系统的技术架构与核心价值这个基于PythonDjangoSSM的智能健康检测系统,本质上是一个融合了现代Web开发技术与健康监测算法的综合性解决方案。我在医疗信息化领域工作多年,见证过各种健康监测系统的迭代,而…

2026/10/17 8:41:19 阅读更多 →
C++ STL list实现原理与手写实践指南

C++ STL list实现原理与手写实践指南

1. 为什么需要自己实现STL的list?在C开发中,STL的list容器是我们最常用的双向链表实现。但很多开发者只是停留在"会使用"的层面,当面试官问到底层实现原理时常常语塞。我见过太多候选人能熟练调用list的接口,却说不出迭…

2026/10/17 8:41:58 阅读更多 →

最新新闻

free-claude-code 开源项目拆解:AI 编程助手的可控性设计与工程实践

free-claude-code 开源项目拆解:AI 编程助手的可控性设计与工程实践

1. 这个项目到底在解决什么问题第一次看到 "free-claude-code" 这个标题,我脑子里蹦出来的第一个念头是:这又是一个想给 AI 编程助手做"平替"或者"增强层"的东西。事实也确实如此。这个项目的核心定位,是围绕 …

2026/10/19 1:35:19 阅读更多 →
10 分钟跑通第一个场景:Habitat-Sim 具身智能 3D 模拟器实战指南

10 分钟跑通第一个场景:Habitat-Sim 具身智能 3D 模拟器实战指南

10 分钟跑通第一个场景:Habitat-Sim 具身智能 3D 模拟器实战指南 【免费下载链接】habitat-sim A flexible, high-performance 3D simulator for Embodied AI research. 项目地址: https://gitcode.com/GitHub_Trending/ha/habitat-sim Habitat-Sim 是一款面…

2026/10/19 1:35:19 阅读更多 →
【WebSocket】 WebSocket 是否支持压缩?如何启用 permessage-deflate 扩展?

【WebSocket】 WebSocket 是否支持压缩?如何启用 permessage-deflate 扩展?

WebSocket 压缩深度解析:permessage-deflate 扩展的原理与实战应用 用户问题原文:WebSocket 是否支持压缩?如何启用 permessage-deflate 扩展? 在构建直播互动弹幕系统时,我们曾因未启用 WebSocket 压缩导致带宽成本飙升 300%,单场热门直播的 CDN 费用高达数万元。根本原…

2026/10/19 1:35:19 阅读更多 →
【项目】【在线判题系统】c端:用户退出登陆与获取当前用户信息

【项目】【在线判题系统】c端:用户退出登陆与获取当前用户信息

目录一、退出登录1.1 controller1.2 service二、获取当前用户信息2.1 controller2.2 service三、修改3.1 token创建3.2 参数修改3.3 传参四、前端一、退出登录 与前面的管理员的退出登录没有区别,注销token即可。 1.1 controller oj-modules/oj-friend/src/main/…

2026/10/19 1:35:19 阅读更多 →
【Android面试】RecylerView专题

【Android面试】RecylerView专题

文章目录一、基础原理与复用缓存1. RecyclerView 与 ListView 的核心区别是什么?2. 四级缓存(mAttachedScrap、mCachedViews、mViewCacheExtension、mRecyclerPool)各自作用、优先级与降级策略,不同滑动 / 刷新场景的命中逻辑&…

2026/10/19 1:35:19 阅读更多 →
黑通道功能安全协议:从原理到落地的完整指南

黑通道功能安全协议:从原理到落地的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:34:19 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →