C++如何判断一个整数是否为半素数(Semiprime)

轻强酱_1339

轻强酱_1339

2026-06-14

565人浏览

原创

半素数是恰好由两个素数(可相同)相乘得到的正整数,即其质因数分解中素因子个数(计重)恰为2;试除到√n足够,因若n=p×q且p≤q,则必有p≤√n,故不会漏判。

c++如何判断一个整数是否为半素数(semiprime)

什么是半素数,以及为什么不能只试除到√n

半素数是指恰好由两个素数相乘得到的正整数(两个素数可以相同,比如 4 = 2 × 2、9 = 3 × 3、6 = 2 × 3 都算;但 8 = 2 × 2 × 2 不算,12 = 2 × 2 × 3 也不算)。关键在于:**因子分解后,素因子的总个数(计重)必须恰好为 2**。

常见误区是认为“只要能被某个素数整除一次,再看商是不是素数就行”——这在 n 很大时可能漏判,比如 n = 97 × 101(两个大素数),你若只试除到 sqrt(n) ≈ 99,会找到 97,然后检查 n / 97 == 101 是否为素数,没问题;但如果 n = p × q 且 p ,你仍能靠这个逻辑捕获;真正危险的是 <code>n 本身是素数(此时只有 1 个素因子)或有 ≥3 个素因子(比如 p × q × r),但试除过程可能提前误判为“两因子”。所以核心不是“找不找得到”,而是“能不能确认只有两个”。

用试除法判断半素数的可靠步骤

对给定正整数 n,需完整做三件事:

  • 若 n ,直接返回 <code>false(最小半素数是 4)
  • 遍历 i 从 2 到 sqrt(n)(含),找出第一个能整除 n 的 i
  • 若没找到任何因子 → n 是素数 → 不是半素数 → 返回 false
  • 若找到第一个因子 i,则令 q = n / i;此时必须同时满足:i 是素数、q 是素数、且 i ≤ q(避免重复,但非必需)
  • 特别注意:如果 i 找到了,但 q 还能被更小的素数整除(比如 n = 12,i = 2,q = 6,而 6 = 2 × 3 → 实际有 3 个素因子),那说明 n 不是半素数。因此不能只检查 q 是否为素数,还要确保它不能再被 ≤ sqrt(q) 的素数整除 —— 但更简单做法是:**只要 i 是最小素因子,那么 q 必须是素数,否则 n 至少有三个素因子**

所以实操中,只需:

  • 写一个辅助函数 is_prime(x),处理 x 、<code>x == 2、偶数、奇数试除到 sqrt(x)
  • 主函数中,从 i = 2 开始试除;一旦 n % i == 0,立刻检查 is_prime(i) 和 is_prime(n / i);若都为真,返回 true;否则返回 false
  • 如果循环结束都没整除 → n 是素数 → 返回 false

示例:n = 15 → i = 3 整除 → is_prime(3) == true, is_prime(5) == true → 返回 true。n = 16 → i = 2 整除 → is_prime(2) == true, is_prime(8) == false → 返回 false。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

边界与性能要注意的几个点

半素数判定看似简单,但在实际编码中容易栽在这些地方:

  • n = 1、0、负数:按定义,半素数是正整数,且 ≥4,所以开头加 if (n
  • sqrt(n) 计算要用整型截断,比如 (int)sqrt(n) 或更稳妥地用 i * i 避免浮点误差
  • is_prime(1) 必须返回 false,is_prime(2) 返回 true,这是基础但常错
  • 当 n 是完全平方数(如 49 = 7 × 7),i == n / i,这时仍满足“两个素数相乘”,应返回 true;你的 is_prime 要能正确处理 7
  • 对于大 n(比如 > 1e12),试除法太慢;此时需要 Miller-Rabin 判素 + Pollard-Rho 分解,但日常题目中 n ≤ 1e9 用上述方法足够

一个可直接粘贴的 C++ 实现

以下代码通过了常见测试用例(4, 6, 9, 10, 14, 15, 21, 25, 49, 121, 1, 2, 3, 8, 12, 16, 100):

bool is_prime(long long x) {
    if (x bool is_semiprime(long long n) {
if (n <p>注意:<code>is_semiprime</code> 中的循环只会找到最小因子 <code>i</code>,因此后续只需验证这一对;不需要继续找其他因子——因为半素数的定义不关心因子顺序,只关心素因子总数是否为 2,而最小因子配对出来的商,就是唯一的另一因子(或其合数形式,此时 <code>is_prime(n/i)</code> 自动失败)。</p><p>最易忽略的一点:很多人写 <code>is_prime</code> 时忘记处理 <code>x == 2</code> 的特例,或把循环起始设成 2 而没跳过偶数,导致超时或误判;还有人用 <code>sqrt</code> 函数却不加 <code>llround</code> 或类型转换,在大数时出错。</p>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习