原始代碼問題
#include
int mian() { // 拼寫錯誤: main
int i, j, t;
for (i = 100; i <= 200; i++) {
t = 0;
for (j = 2, j < 1, j++) { // 條件寫錯: j<1 恆假, 應 j
三大致命錯誤
mian → main,程式進入點錯誤。
for (j=2; j<1; j++) 條件 j<1 恆假,內層迴圈**零次執行**,t 保持 0,所有數都被判為質數。
if (t = 0) 是**賦值**,值為 0 (假),if 條件恆假,**從不印質數**。應為 if (t == 0)。
修正後完整版 (試除法優化至 √n)
#include
#include
int main(void) {
printf("100 到 200 之間的質數:\n");
for (int i = 100; i <= 200; i++) {
int is_prime = 1; // 旗標: 1=質數, 0=合數
int limit = (int)sqrt(i); // 只需試除到 √i
for (int j = 2; j <= limit; j++) {
if (i % j == 0) {
is_prime = 0;
break; // 找到因子立即跳出
}
}
if (is_prime)
printf("%d ", i);
}
printf("\n");
return 0;
}
輸出結果
100 到 200 之間的質數:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
進階優化:埃拉托斯特尼篩法 (O(n log log n))
void sieve_primes(int max_n) {
char *is_prime = calloc(max_n + 1, 1); // 0=質數, 1=合數
is_prime[0] = is_prime[1] = 1;
for (int i = 2; i * i <= max_n; i++)
if (!is_prime[i])
for (int j = i * i; j <= max_n; j += i)
is_prime[j] = 1;
for (int i = 100; i <= 200; i++)
if (!is_prime[i]) printf("%d ", i);
free(is_prime);
}
避坑口訣
main 拼寫正確,**IDE 會紅線提示**。
- 迴圈邊界**手動跑一遍邊界值** (如
j=2, limit=10 是否執行)。
if (flag == 0) 比較,**寫成 if (0 == flag) 習慣防手滑賦值** (編譯器會報錯 assignment to constant)。
- 質數判斷**只需試除到 √n**,大幅減少迴圈次數。