通过率 38% · 提交 788 · 通过 296
小慕正在学习RSA加密算法的原理,他了解到,这种算法的安全性依赖于大整数分解的困难性——数字越大,破解难度越高。现在,小慕拿到了一个,他想知道这个数是由哪两个相乘得到的。请你帮助小慕完成这个任务。
这类题属于华为 OD 机考真题方向中「100分 / 数学」方向的高频题型,通常考察对「100分 / 数学」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
1个正整数num
0 < num <= 2147483647
如果成功找到,以单个空格分割,从小到大输出两个素数。分解失败,请输出-1 -1
示例 1
输入示例
15
输出示例
3 5
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
经典的大数分解问题。 关于素数相关的内容,可以详看 算法题中常用数学概念、公式、方法汇总 里的相关部分。
比较容易想到的暴力解法包含以下步骤:
1. 从小到大枚举所有小于 sqrt(num) 的数 a。 2. 判断 num 是否可以整除 a:
a。a 是否是素数:a。b = num // a 是否是素数:a。a、b 为答案。上述过程慢的原因主要在于,计算 a 或 b 是否是素数的环节。 可以使用质数筛来优化上述过程。
使用质数筛解决上述大数分解的过程如下:
1. 构建长度为 num + 1 的质数筛数组 sieve。 sieve[i] 是 True 表示 i 是质数,sieve[i] 是 False 表示 i 是合数。 2. 枚举质数筛中每一个质数 a,即 sieve[a] = True 的下标。 3. 判断 num 是否可以整除 a:
a。b = num // a 是否是素数:a。a、b 为答案。复杂度分析 设输入的数为 num。瓶颈在埃氏筛的构建:需要初始化长度为 num+1 的布尔数组,并对每个素数标记其所有倍数,时间复杂度为 O(num log log num),空间复杂度为 O(num)。之后的枚举阶段,从小到大遍历所有素数 a,对每个 a 做一次整除判断,命中时用集合(Python 版 set,O(1) 查询)判断 b = num // a 是否为素数,这一段不超过 O(num)。整体时间由筛主导,为 O(num log log num);num 越大,筛的内存与时间开销越明显,这是本算法的主要瓶颈。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有