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/8/4 3:42:23 阅读更多 →
Python+Django+SSM构建智能健康检测系统架构解析

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

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

2026/8/4 3:42:23 阅读更多 →
C++ STL list实现原理与手写实践指南

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

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

2026/8/4 3:42:23 阅读更多 →

最新新闻

生物素-全反式维甲酸Biotin-Retinoic Acid, Biotin-ATRA亲和探针

生物素-全反式维甲酸Biotin-Retinoic Acid, Biotin-ATRA亲和探针

生物素 - 维甲酸(Biotin-Retinoic Acid, Biotin-ATRA)探针一、探针概述全反式维甲酸(All-trans-retinoic acid,ATRA,维甲酸)是维生素 A 体内核心活性代谢产物,通过靶向核受体RARα/β/γ&#x…

2026/8/4 4:22:44 阅读更多 →
WebP图片格式优势与批量转换工具全解析

WebP图片格式优势与批量转换工具全解析

1. 为什么WebP图片越来越常见?WebP格式由Google在2010年推出,是一种同时支持有损和无损压缩的现代图片格式。根据Google官方测试数据,在同等视觉质量下,WebP图片比JPEG小25-34%,比PNG小26%。这种显著的体积优势使其成为…

2026/8/4 4:22:44 阅读更多 →
迈向国产化平台:摩尔信使MThings Ubuntu AMD64版

迈向国产化平台:摩尔信使MThings Ubuntu AMD64版

不少工业现场已经在使用国产化Linux。工控机、边缘计算设备、值班电脑和企业服务器中,都能看到它的身影。摩尔信使 MThings Ubuntu AMD64 版,让已经使用Ubuntu的现场多一个简单选择:在熟悉的系统中安装MThings,继续完成设备连接、…

2026/8/4 4:22:44 阅读更多 →
告别命令行恐惧:用N_m3u8DL-CLI-SimpleG轻松下载M3U8视频

告别命令行恐惧:用N_m3u8DL-CLI-SimpleG轻松下载M3U8视频

告别命令行恐惧:用N_m3u8DL-CLI-SimpleG轻松下载M3U8视频 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的命令行参数而头疼吗?想下载M3U8格式…

2026/8/4 4:22:44 阅读更多 →
Linux grep命令深度解析:从正则表达式到高效日志排查实战

Linux grep命令深度解析:从正则表达式到高效日志排查实战

1. 项目概述:为什么grep是Linux工程师的“瑞士军刀”?在Linux世界里,处理文本和日志是家常便饭。无论是排查一个线上服务的错误,还是从成千上万的配置文件中找到某个特定的参数,我们都需要一种高效、精准的“搜索”能力…

2026/8/4 4:22:44 阅读更多 →
支付宝支付接口集成实战:从环境配置到异步通知的完整指南

支付宝支付接口集成实战:从环境配置到异步通知的完整指南

1. 项目概述:从零到一搞定支付宝接口如果你是一名开发者,无论是负责电商、在线服务还是任何涉及线上支付的业务,集成支付宝支付接口几乎是必经之路。这听起来像是一个标准的“调用API”的任务,但真正做过的朋友都知道,…

2026/8/4 4:21:44 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →