因为若n有大于√n的因子,则必存在对应的小于等于√n的因子,故只需检查2到√n间的整数是否能整除n,若都不能整除,n即为质数。

为什么质数判断要检查到 sqrt(n) 就够了
因为如果 n 有大于 sqrt(n) 的因子,那它一定对应一个小于 sqrt(n) 的配对因子。比如 28 = 4 × 7,其中 4 ,而 <code>7 > sqrt(28)。所以只要没在 [2, sqrt(n)] 找到因子,n 就一定是质数。
注意:必须用 i 或更稳妥的 <code>i * i —— 后者避免浮点误差和类型转换开销,也绕过 <code>sqrt() 的头文件依赖。
int 范围内质数判断的边界处理
小整数(0、1)不是质数;2 是唯一偶质数;所有大于 2 的偶数直接返回 false。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 先特判
n → <code>false - 再特判
n == 2→true - 再特判
n % 2 == 0→false - 后续只需试除奇数:
for (int i = 3; i * i
避免 i * i 溢出的写法
当 n 接近 INT_MAX(约 2^31−1)时,i * i 可能溢出成负数,导致循环条件意外为真或崩溃。
安全做法是改用除法比较:
for (int i = 3; i <= n / i; i += 2)
这个表达式等价于 i * i ,但全程用整数运算,无溢出风险,且编译器通常能优化掉重复除法。
完整可运行的函数示例
以下函数已覆盖边界、奇偶、溢出、效率四点:
bool is_prime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i <= n / i; i += 2) {
if (n % i == 0) return false;
}
return true;
}别忘了测试 is_prime(1)、is_prime(2)、is_prime(97)、is_prime(99) 和 is_prime(INT_MAX) —— 最后一个最容易暴露溢出逻辑是否真可靠。


















