判斷整數 n 是否為素數。優化:特判 2、排除偶數、只試除到 √n、步長 2。
#include <stdio.h>
#include <math.h>
#define YES 1
#define NO 0
int is_prime(int n) {
if (n == 2) return YES;
if (n < 2 || n % 2 == 0) return NO;
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) return NO;
}
return YES;
}
int main() {
int n;
printf("輸入數字:");
scanf("%d", &n);
if (is_prime(n) == YES)
printf("%d 是素數\n", n);
else
printf("%d 不是素數\n", n);
return 0;
}
| 版本 | 循環次數 (n=10^9+7) | 耗時 |
|---|---|---|
| 朴素 (2~n-1) | ~10^9 | 極慢 |
| 優化至 √n | ~31623 | 快 |
| 再跳過偶數 | ~15811 | 更快 |
| 預計算 √n | 同上 | 避免重複開方 |
int is_prime_fast(int n) {
if (n == 2) return 1;
if (n < 2 || n % 2 == 0) return 0;
int limit = (int)sqrt(n);
for (int i = 3; i <= limit; i += 2) {
if (n % i == 0) return 0;
}
return 1;
}
2 → 素數 3 → 素數 4 → 非素數 17 → 素數 100 → 非素數 9973 → 素數