判斷 n 是否為質數,只需試除到 √n。進一步優化:
#include <stdio.h>
#include <math.h>
int main() {
int count = 0;
for (int i = 101; i <= 199; i += 2) { // 只檢查奇數
int limit = (int)sqrt(i);
int is_prime = 1;
for (int j = 3; j <= limit; j += 2) {
if (i % j == 0) { is_prime = 0; break; }
}
if (is_prime) {
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count); // 輸出 21
return 0;
}
sqrt 需 <math.h>,編譯時加 -lm (GCC)。i += 2 跳過偶數,內層 j += 2 同理,效率提升 ~4 倍。limit 計算一次放外層,避免重複呼叫 sqrt。若範圍大(如 1~1,000,000),試除法太慢,應用 Sieve of Eratosthenes (埃氏篩),時間複雜度 O(n log log n),空間 O(n)。
// 篩選 1~MAX 的質數
#define MAX 1000000
bool is_prime[MAX+1];
void sieve() {
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
for (int i = 2; i*i <= MAX; i++)
if (is_prime[i])
for (int j = i*i; j <= MAX; j += i)
is_prime[j] = false;
}
小範圍質數篩選,優化試除法足夠;大範圍必用埃氏篩或線性篩。掌握 √n 邊界與奇數優化是基礎功力。