圖片中的流程圖顯示判斷素數的邏輯為「甚至只須被 2~n」,這會導致時間複雜度達到 O(n)。對於大數判斷極其低效。
數學原理:若整數 n 有一個大於 √n 的因子,則必定有一個對應的小於 √n 的因子。因此只需檢查 2 到 √n 之間的整數即可。
i ≤ √n#include
#include
bool isPrime(int n) {
if (n <= 1) return false;
if (n <= 3) return true; // 2, 3 是素數
if (n % 2 == 0 || n % 3 == 0) return false; // 排除 2 和 3 的倍數
// 只檢查 6k±1 形式的數,進一步減少 1/3 迭代
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
| 方法 | 時間複雜度 | 測試 10^9 耗時(估) |
|---|---|---|
| 原始 O(n) | O(n) | 數秒 |
| 優化 O(√n) | O(√n) | 微秒級 |
| 6k±1 進階優化 | O(√n/3) | 更快 |
i * i <= n 中若 n 接近 INT_MAX,i*i 會溢位,建議改用 i <= n / i 或 (long long)i * i <= nsqrt(n) 進行循環判斷,整數運算更可靠