首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言質數篩選程式修正:for (j=2; j<i; j++) 邊界、t=0 旗標邏輯、main 規範

     編輯:C 語言問答

原始代碼問題


#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

三大致命錯誤

  1. mian → main,程式進入點錯誤。
  2. for (j=2; j<1; j++) 條件 j<1 恆假,內層迴圈**零次執行**,t 保持 0,所有數都被判為質數。
  3. 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**,大幅減少迴圈次數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved