半素数是且仅是两个素数(可相同)乘积的正整数;判断时需试除至√n并统计素因子个数,最终剩余>1则再计1次,总数恰为2即成立。

什么是半素数,以及为什么不能只看因数个数
半素数不是指“恰好有4个因数”的数——这是常见误解。它严格定义为:能且仅能表示为两个素数乘积的正整数(两个素数可以相同,如 4 = 2 × 2、9 = 3 × 3)。所以 6 = 2 × 3 是,12 = 2 × 2 × 3 不是(三个素因子),1 和所有素数本身也不是。
直接暴力试除到 n 太慢;试除到 sqrt(n) 是合理起点,但必须确保**分解后只剩两个素因子,且无剩余**。
用试除法提取素因子并计数
核心思路:边试除边记录素因子个数,一旦发现第三个素因子(即除完前两个后余数 > 1 且不是素数,或本身就是合数),就可提前返回 false。
实操建议:
- 从
2开始枚举到sqrt(n),每次找到能整除的最小素因子p,计数器count++,然后不断用n /= p直到不能整除 - 若过程中
count > 2,立即返回false - 循环结束后,若
n > 1,说明剩下一个大于sqrt(n)的因子,再count++ - 最终判断
count == 2即可——注意此时无需额外验证剩下的n是否为素数,因为它是唯一剩余因子,且原n是整数,它必为素数(否则当初在更小范围内就能被拆出非素因子)
示例:isSemiprime(15):先除 3 得 5,count=1;循环结束 n=5 > 1,count=2 → true。isSemiprime(30):除 2 得 15(count=1),再除 3 得 5(count=2),剩 5 > 1 → count=3 → false。
避免重复素性判断和边界错误
常见坑是给每个因子单独调用 isPrime(),既冗余又易错——比如对 49,试除到 7 就得到因子 7,再除一次得 7,剩 1,count=2;但如果误判 7 非素数,就会错判。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
更稳妥的做法是:不单独验素性,靠试除过程本身保证因子为素数(因为总是从最小可能因子开始除,合数因子必然已被其素因子提前消掉)。
边界注意点:
n 直接返回 <code>false(最小半素数是4)- 循环上界用
i * i 而非 <code>i ,避免浮点误差和类型转换问题 - 整除判断用
n % i == 0,别漏掉%运算符
完整可运行的判断逻辑(C++)
以下函数满足 O(√n) 时间、无额外库依赖、覆盖全部边界:
bool isSemiprime(int n) {
if (n 2) return false;
n /= i;
}
}
if (n > 1) count++;
return count == 2;
}
关键细节:内层 while 确保同一个素因子被完全除尽;count 在除的过程中累加;最后剩的 n 只需一次计数——它天然就是素数,无需再 call isPrime。
真正容易被忽略的是:当 n 被反复除后变成 1,此时不能再加 count;只有 n > 1 才说明还有未被试除出的大因子。这个判断位置和条件稍错,就会把 4、9、25 全判错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










