因为若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。
实操建议:
- 先特判
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 <p>这个表达式等价于 <code>i * i ,但全程用整数运算,无溢出风险,且编译器通常能优化掉重复除法。</code></p><h3>完整可运行的函数示例</h3><p>以下函数已覆盖边界、奇偶、溢出、效率四点:</p><pre class="brush:php;toolbar:false;">bool is_prime(int n) {
if (n <p>别忘了测试 <code>is_prime(1)</code>、<code>is_prime(2)</code>、<code>is_prime(97)</code>、<code>is_prime(99)</code> 和 <code>is_prime(INT_MAX)</code> —— 最后一个最容易暴露溢出逻辑是否真可靠。</p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











