判断素数只需试除到√n且跳过偶数:先处理n<2、n==2和偶数情况,再用i<=n/i从3开始奇数试除,避免溢出。

判断一个数是否为素数,核心是减少不必要的试除次数。最直接的优化是:只需检查到该数的平方根即可,且可跳过偶数(除 2 外)。
只试除到 √n
若 n 有大于 √n 的因数 d,则必存在对应的小于 √n 的因数 n/d。因此,只要在 2 到 √n(含)之间找不到能整除 n 的数,n 就是素数。
- 对 n = 100,只需检查 2 到 10,不用试到 99
- 用 i * i <= n 替代 i <= Math.sqrt(n),避免浮点运算和类型转换开销
单独处理 2,其余只检查奇数
除了 2,所有偶数都不是素数。所以先判断 n == 2,再排除 n % 2 == 0 的情况,后续循环只需从 3 开始,每次加 2。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 节省约一半的循环次数
- 注意:要先处理 n < 2 和 n == 2 的边界情况(1 不是素数,2 是)
完整优化代码示例
// 返回 true 表示是素数
立即学习“Java免费学习笔记(深入)”;
public static boolean isPrime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return false;
}
return true;
}
小提醒:注意 int 溢出风险
当 n 接近 Integer.MAX_VALUE 时,i * i 可能溢出变成负数,导致循环条件失效。安全写法是:i <= n / i(整数除法,无溢出)。
- 例如:n = 2147483647(质数),用 i * i 会溢出;改用 i <= n / i 更稳妥
- n / i 是向下取整,但不影响正确性,因为 i ≤ √n ⇔ i ≤ n/i(当 i > 0)

















