首页/新闻资讯/正文详情

蓝桥杯Java解题:质数判定与异或分组实战

发布时间:2026/11/5 11:31:51 来源:云帆数科 栏目:资讯中心
蓝桥杯Java解题:质数判定与异或分组实战
1. 蓝桥杯Java B组解题实战质数判定与异或分组最近在准备蓝桥杯竞赛的同学经常会遇到两类经典问题质数相关计算和位运算应用。今天我就结合两道典型题目分享一下我的解题思路和优化技巧。这两道题都来自第十六届蓝桥杯Java B组分别是第三题和第四题涉及集合操作、质数筛法和异或运算等核心知识点。2. 两数之和为质数问题解析2.1 问题描述与输入输出给定两个整数数组a和b长度分别为n和m。要求统计所有满足a[i] b[j]为质数的不同组合的数量其中质数的范围不超过nm。输入格式第一行两个整数n, m第二行n个整数表示数组a第三行m个整数表示数组b输出格式一个整数表示满足条件的不同的质数和的数量示例 输入 3 4 2 1 3 4 5 6 7 输出 32.2 解题思路与算法选择这道题的核心在于高效判断两个数之和是否为质数。直接思路是双重循环遍历所有a[i]b[j]组合然后对每个和进行质数判断。但这种朴素方法的时间复杂度是O(n×m×√S)当n和m较大时比如都达到10^5这种解法显然会超时。更优的解决方案是预处理出所有可能的质数使用埃拉托斯特尼筛法使用HashSet存储质数实现O(1)查询遍历所有a[i]b[j]组合用HashSet快速判断是否为质数这种优化将时间复杂度降为O(n×m)空间复杂度为O(S)其中S是nm的最大值。2.3 埃拉托斯特尼筛法实现埃氏筛是解决质数判定问题的经典算法其核心思想是从小到大枚举每个数如果当前数未被标记为非质数则它是质数并标记它的所有倍数为非质数。SetInteger sieveOfEratosthenes(int max) { SetInteger primes new HashSet(); boolean[] isComposite new boolean[max 1]; for (int i 2; i max; i) { if (!isComposite[i]) { primes.add(i); for (int j i * 2; j max; j i) { isComposite[j] true; } } } return primes; }在实际编码中我们可以进一步优化外层循环只需遍历到√max内层循环可以从i²开始而不是2i2.4 完整代码实现与注释import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class PrimeSumPairs { public static void main(String[] args) { Scanner scan new Scanner(System.in); int n scan.nextInt(); int m scan.nextInt(); int maxSum n m; // 预处理质数集合 SetInteger primes new HashSet(); boolean[] isComposite new boolean[maxSum 1]; for (int i 2; i maxSum; i) { if (!isComposite[i]) { primes.add(i); for (int j i * 2; j maxSum; j i) { isComposite[j] true; } } } int[] a new int[n]; int[] b new int[m]; for (int i 0; i n; i) { a[i] scan.nextInt(); } for (int i 0; i m; i) { b[i] scan.nextInt(); } SetInteger validSums new HashSet(); for (int numA : a) { for (int numB : b) { int sum numA numB; if (primes.contains(sum)) { validSums.add(sum); } } } System.out.println(validSums.size()); scan.close(); } }2.5 性能优化与注意事项输入规模考虑当n和m较大时如10^5双重循环的O(n×m)复杂度仍然可能超时。这时需要考虑更优的算法如先统计数字频率再组合计算。质数筛法选择对于更大的数据范围如10^7以上埃氏筛可能空间不足可以考虑欧拉筛线性筛。边界条件处理注意1不是质数和为2的情况需要特殊处理因为2是唯一的偶质数输入数字可能为负数需要额外判断集合选择使用HashSet而不是TreeSet因为前者查询时间复杂度为O(1)后者为O(log n)。提示在竞赛中当遇到质数相关问题时预处理质数表往往是关键优化点。提前计算好质数可以大幅减少运行时的计算量。3. 电池分组异或问题解析3.1 问题描述与异或性质给定一个整数数组要求判断是否能将其分成两个非空子集使得两个子集的异或和相等。异或XOR的重要性质交换律a ^ b b ^ a结合律(a ^ b) ^ c a ^ (b ^ c)自反性a ^ a 0恒等性a ^ 0 a3.2 数学推导与解题思路设总异或和为total两个子集的异或和分别为X和Y。根据题意有 X Y 根据异或性质 total X ^ Y X ^ X 0反过来如果total 0那么任意一个子集的异或和X另一个子集的异或和Y X ^ total X ^ 0 X即总能找到满足条件的分组。因此问题简化为判断整个数组的异或和是否为0如果total 0输出YES否则输出NO3.3 完整代码实现import java.util.Scanner; public class XorPartition { public static void main(String[] args) { Scanner scan new Scanner(System.in); int n scan.nextInt(); int[] batteries new int[n]; int totalXor 0; for (int i 0; i n; i) { batteries[i] scan.nextInt(); totalXor ^ batteries[i]; } System.out.println(totalXor 0 ? YES : NO); scan.close(); } }3.4 特殊情况分析与验证数组长度为2必须两个数相等才能分组此时异或和确实为0。所有元素相同如果元素个数为偶数可以平分如果为奇数异或和不为0除非元素本身就是0包含0的情况0不影响异或结果可以灵活分配。验证示例 输入3 1 2 3 计算3 ^ 1 ^ 2 ^ 3 (3 ^ 3) ^ (1 ^ 2) 0 ^ 3 3 ≠ 0 → NO输入4 1 2 3 0 计算1 ^ 2 ^ 3 ^ 0 0 → YES3.5 扩展思考找出具体分组方案虽然题目只要求判断可行性但我们可以进一步思考如何找到具体的分组方案。当total 0时任何非空真子集的异或和X其补集的异或和必然也是X。因此可以计算前缀异或和找到第一个位置i使得prefixXor[i]等于任意X前i个元素为一组其余为另一组// 扩展找出一个可行的分组方案 ListInteger findPartition(int[] arr) { int total 0; for (int num : arr) total ^ num; if (total ! 0) return null; int prefix 0; for (int i 0; i arr.length; i) { prefix ^ arr[i]; if (prefix (total ^ prefix)) { ListInteger group new ArrayList(); for (int j 0; j i; j) { group.add(arr[j]); } return group; } } return null; }4. 竞赛编程技巧与常见问题4.1 质数相关问题优化技巧预处理质数表在程序开始时一次性计算出可能用到的所有质数避免重复计算。质数判定优化试除法只需检查到√n排除偶数除2外使用6k±1优化所有大于3的质数都可以表示为6k±1质因数分解结合筛法预处理最小质因子可以快速分解任意数的质因数。4.2 位运算技巧总结异或性质应用交换两个数a ^ b; b ^ a; a ^ b;找出只出现一次的数字其他都出现两次不使用临时变量交换值常用位操作判断奇偶n 1取最低位的1n -n清除最低位的1n (n - 1)状态压缩使用整数的二进制位表示集合可以高效处理子集、组合等问题。4.3 Java集合类的选择与性能HashSet vs TreeSetHashSet基于哈希表O(1)查询无序TreeSet基于红黑树O(log n)查询有序ArrayList vs LinkedListArrayList随机访问快O(1)插入删除慢O(n)LinkedList随机访问慢O(n)插入删除快O(1)HashMap优化预设初始容量避免扩容使用包装类型时注意自动装箱开销4.4 竞赛中的输入输出优化使用BufferedReader代替ScannerBufferedReader br new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st new StringTokenizer(br.readLine()); int n Integer.parseInt(st.nextToken());输出大量数据时使用StringBuilderStringBuilder sb new StringBuilder(); for (int i 0; i n; i) { sb.append(result[i]).append( ); } System.out.println(sb.toString().trim());关闭同步提升速度仅Cios::sync_with_stdio(false); cin.tie(nullptr);4.5 调试与测试技巧边界测试空输入单个元素最大值/最小值边界随机测试数据生成Random random new Random(); int n random.nextInt(100) 1; int[] arr new int[n]; for (int i 0; i n; i) { arr[i] random.nextInt(1000); }断言调试assert totalXor 0 : Total XOR should be zero for valid partition;在实际竞赛中我通常会先写出朴素解法确保正确性然后再逐步优化。对于质数相关问题预处理是关键而对于位运算问题深入理解其性质往往能发现巧妙的解法。这两道题虽然看似简单但包含了算法竞赛中许多核心思想值得反复练习和思考。

相关推荐

PostgreSQL透明列加密技术实战与优化
PostgreSQL透明列加密技术实战与优化

1. 透明列加密技术背景解析 在数据库安全领域,透明列加密(Transparent Column Encryption)正成为保护敏感数据的关键技术。PostgreSQL作为最先进的开源关系型数据库,其加密方案一直备受关注。不同于传统的全库加密或应用层加密&am… · 2026/11/5 11:31:51

现代CMake在C++项目中的核心价值与实战技巧
现代CMake在C++项目中的核心价值与实战技巧

1. CMake在现代C项目中的核心价值 十年前我刚接触CMake时,它还是个需要手动写Makefile的辅助工具。如今在CLion、VS Code等主流IDE的推动下,CMake已成为C生态的事实构建标准。不同于简单的编译指令拼接,现代CMake的核心价值在于: … · 2026/11/5 11:31:51

STM32F446裸机+FreeRTOS双模启动框架详解
STM32F446裸机+FreeRTOS双模启动框架详解

简介:本资源是一套基于STM32F446微控制器的完整嵌入式开发工程,面向嵌入式初学者与进阶开发者,聚焦ARM Cortex-M4平台外设驱动实战,覆盖GPIO、SPI、定时器、ADC/DAC(DMA模式)、UART(DMA模式&… · 2026/11/5 11:31:51

SEATA AT模式原理与实践:分布式事务解决方案
SEATA AT模式原理与实践:分布式事务解决方案

1. SEATA AT模式核心原理剖析 分布式事务一直是微服务架构中的难点问题,SEATA作为开源的分布式事务解决方案,其AT模式(Auto Transaction)通过二阶段提交实现了对业务代码的低侵入性支持。这种模式最大的特点是完全不需要改造业务S… · 2026/11/5 11:32:51

Simulink S-function执行时序与状态管理原理详解
Simulink S-function执行时序与状态管理原理详解

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&… · 2026/11/5 11:32:51

低空经济三维智能感知与实时调度技术解析
低空经济三维智能感知与实时调度技术解析

1. 低空经济三维空间智能感知与管控体系概述低空经济作为新兴经济形态,正在全球范围内快速发展。根据国际航空运输协会(IATA)预测,到2030年,全球城市空中交通市场规模将达到1.5万亿美元。在这一背景下,《低… · 2026/11/5 11:32:51

链表数据结构与PTA解题技巧详解
链表数据结构与PTA解题技巧详解

1. 链表基础与数据结构课程实践 链表作为线性表的链式存储结构,是数据结构课程中承前启后的关键内容。在山东理工大学(SDUT)的数据结构与算法课程体系中,链表章节通常安排在顺序表之后、树结构之前,这种教学顺序设计体… · 2026/11/5 11:32:51

Simulink S-Function核心机制与两个经典C示例解析
Simulink S-Function核心机制与两个经典C示例解析

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&… · 2026/11/5 11:32:51

蓝桥杯Java解题:质数判定与异或分组实战
蓝桥杯Java解题:质数判定与异或分组实战

1. 蓝桥杯Java B组解题实战:质数判定与异或分组最近在准备蓝桥杯竞赛的同学经常会遇到两类经典问题:质数相关计算和位运算应用。今天我就结合两道典型题目,分享一下我的解题思路和优化技巧。这两道题都来自第十六届蓝桥杯Java B组&#xff0c… · 2026/11/5 11:31:51

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码