大於 1 的自然數,除 1 與自身外無其他因子。
試除法:對 n,檢查 2 ~ √n 是否有因子。若無則為質數。
原程式迴圈 for(i=2; i<=num/2; i++),上限 num/2 雖正確但非最優。
最佳上限為 √num(含),因若 a×b=n 且 a≤b,則 a≤√n。
#include <stdio.h>
#include <math.h>
int isPrime(int n)
{
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0; // 排除偶數
for (int i = 3; i*i <= n; i += 2) // 只檢查奇數
if (n % i == 0) return 0;
return 1;
}
int main()
{
int num;
printf("請輸入大於 1 的整數: ");
scanf("%d", &num);
printf("%d %s質數\n", num, isPrime(num) ? "是" : "不是");
return 0;
}
| 方法 | 迴圈上限 | 迴圈次數(對 n=10⁹) | 備註 |
|---|---|---|---|
| 原版 | n/2 | 5×10⁸ | 極慢 |
| √n 版 | √n | 31623 | 快 1.5 萬倍 |
| √n+跳過偶數 | √n/2 | 15811 | 再快 2 倍 |
| Miller-Rabin | O(k log³ n) | ~幾百次 | 大數專用 |
i*i <= n 比 i <= sqrt(n) 更快且避免浮點誤差isPrime() 便於重複呼叫與單元測試若需找出 N 以內所有質數,用 埃拉托斯特尼篩法 O(N log log N) 遠快於逐一試除。