判断单个数字是否为质数
在Java中,判断一个数字是否为质数是最基础的操作,质数的定义是大于1的自然数,除了1和它本身外没有其他约数,基于这一定义,最直观的方法是试除法:从2开始遍历到该数字的平方根(因为如果存在大于平方根的约数,必然对应一个小于平方根的约数),检查是否能被整除,如果能被任何数整除,则不是质数。

以下是一个简单的实现代码:
public static boolean isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
优化点:
- 排除偶数:除了2,所有偶数都不是质数,可以在循环前先判断num是否为2,否则跳过所有偶数。
- 提前终止:一旦找到约数即可返回false,无需继续遍历。
查找一定范围内的所有质数
如果需要找出某个区间内的所有质数(如1到1000),更高效的方法是埃拉托斯特尼筛法(Sieve of Eratosthenes),该算法通过标记非质数的方式,避免重复计算,时间复杂度为O(n log log n),适合大范围筛选。
算法步骤:

- 创建一个布尔数组
isPrime,初始值全部设为true,索引代表数字本身。 - 从2开始,将2的所有倍数标记为false(非质数)。
- 遍历到当前数的平方根,重复上述步骤,未被标记的数即为质数。
Java实现示例:
public static List<Integer> sieveOfEratosthenes(int limit) {
boolean[] isPrime = new boolean[limit + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= limit; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= limit; j += i) {
isPrime[j] = false;
}
}
}
List<Integer> primes = new ArrayList<>();
for (int i = 2; i <= limit; i++) {
if (isPrime[i]) {
primes.add(i);
}
}
return primes;
}
优化点:
- 内层循环起点:从
i * i开始标记,因为更小的倍数已被更小的质数处理过。 - 空间优化:可以使用位运算进一步压缩数组空间,但会增加代码复杂度。
处理大数的质数判断
对于大整数(如超过Integer.MAX_VALUE),Java提供了BigInteger类,试除法在大数场景下效率极低,可采用概率性算法(如Miller-Rabin测试)或确定性算法(如AKS算法)。
Miller-Rabin测试(常用实现):

import java.math.BigInteger;
public static boolean isProbablePrime(BigInteger num, int certainty) {
return num.isProbablePrime(certainty); // 内部实现Miller-Rabin测试
}
参数certainty表示测试的准确性(如10表示误判概率低于1/2^10)。
性能对比与选择
| 方法 | 适用场景 | 时间复杂度 |
|---|---|---|
| 试除法 | 小范围单个数字 | O(√n) |
| 埃拉托斯特尼筛法 | 小范围批量查找 | O(n log log n) |
| Miller-Rabin测试 | 大数或高精度需求 | O(k log³n) |
- 小规模单个数字:试除法足够高效,结合偶数优化后性能更佳。
- 大范围批量查找:优先选择埃拉托斯特尼筛法,避免重复计算。
- 超大数判断:使用
BigInteger的概率性算法,平衡效率与准确性。
通过合理选择算法,可以在Java中高效解决质数相关问题。

















