大於 1 的自然數,除 1 和自身外無其他因數。最小質數 2(唯一偶質數)。質數無限多(歐幾里得證明)。
for (int i = 2; i < n; i++) {
int count = 0;
for (int j = 2; j <= i; j++) {
if (i % j == 0) count++;
if (count > 1) break;
}
if (count == 1) print(i);
}
雙重循環,效率極低。
public static boolean isPrime(int num) {
for (int j = 2; j <= Math.sqrt(num); j++) {
if (num % j == 0) return false;
}
return true;
}
利用「因子成對出現,至少一個 ≤ √n」原理,大幅減少除法次數。
private static List<Integer> getPrimes(int n) {
List<Integer> primes = new ArrayList<>();
primes.add(2);
for (int i = 3; i <= n; i += 2) { // 跳過偶數
if (!divisible(i, primes)) primes.add(i);
}
return primes;
}
private static boolean divisible(int n, List<Integer> primes) {
for (Integer p : primes) {
if (n % p == 0) return true;
if (p * p > n) break; // 關鍵優化:只需試除到 √n
}
return false;
}
核心思想:一個數若不能被所有比它小的質數整除,則它是質數。維護已知質數表,試除時提前終止(p² > n)。