尋找質數是程式設計入門的經典題目,雖然概念基礎,但初學者常在實作細節上碰壁。無論是物件導向或程序導向語言,核心邏輯大同小異。本文提供兩種 Java 實作供參考:一般試除法與篩法。
最直觀的做法是對每個數字進行試除。為了效率,只需檢查到該數的平方根即可:若 2 到 √n 之間沒有因數,該數即為質數。
public class Prime {
public static void main(String[] args) {
for (int i = 2; i < 100; i++) {
int j;
for (j = 2; j < (int) (Math.sqrt(i) + 1); j++) {
if (i % j == 0) {
break;
}
}
if (j > (int) Math.sqrt(i)) {
System.out.print(i + " ");
}
}
}
}
關鍵點解析:
Math.sqrt(i) + 1,大幅減少除法次數。j > Math.sqrt(i)),代表沒找到因數,輸出該質數。篩法適合一次找出某範圍內所有質數,時間複雜度接近 O(n log log n),比試除法快得多。核心思想:建立布林/整數陣列標記合數,逐步「篩」掉倍數。
public class Prime2 {
public static void main(String[] args) {
int n = 100;
int[] array = new int[n];
for (int i = 2; i < n; i++) {
array[i] = i;
}
for (int i = 2; i < n; i++) {
if (array[i] != 0) {
int temp = array[i];
for (int j = 2 * temp; j < n; j += temp) {
array[j] = 0;
}
}
}
for (int i = 0; i < n; i++) {
if (array[i] != 0) {
System.out.print(i + " ");
}
}
}
}
運作流程:
array[i] != 0 則 i 為質數。| 演算法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 試除法 | O(n√n) | O(1) | 單一數字判斷、範圍較小 |
| 篩法 | O(n log log n) | O(n) | 批量求區間質數、上限已知 |
實務上,若只需判斷單一大數是否為質數,可改用 Miller-Rabin 概率測試;若需在固定區間高頻查詢,預先跑篩法建表最划算。