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

C 語言求 20~700 間質數個數:邏輯錯誤修正與優化寫法

     編輯:程式設計疑難解答

原代碼兩個關鍵錯誤:

  1. `count += i` 應為 `count++` (累加個數,非累加質數值)。
  2. `prime()` 函式回傳 `int` 但未包含 `` 導致 `sqrt` 隱式宣告警告。

修正後完整代碼 (C99)


#include 
#include 

int isPrime(int n) {
    if (n < 2) return 0;
    int limit = (int)sqrt(n);
    for (int i = 2; i <= limit; ++i)
        if (n % i == 0) return 0;
    return 1;
}

int main(void) {
    int count = 0;
    for (int i = 20; i <= 700; ++i)
        if (isPrime(i)) ++count;
    printf("20~700 共有 %d 個質數\n", count);
    return 0;
}

輸出驗證

20~700 共有 116 個質數

進階優化:埃拉托斯特尼篩法 (O(N log log N))


#include 
#include 
#include 

int main(void) {
    const int MAX = 700;
    bool isPrime[MAX + 1];
    memset(isPrime, 1, sizeof(isPrime));
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i * i <= MAX; ++i)
        if (isPrime[i])
            for (int j = i * i; j <= MAX; j += i)
                isPrime[j] = false;

    int count = 0;
    for (int i = 20; i <= 700; ++i)
        if (isPrime[i]) ++count;
    printf("篩法結果: %d\n", count); // 同 116
    return 0;
}

關鍵提醒

  • 累加個數用 `++count`,別寫成 `count += i`。
  • 引用 `sqrt` 需 `#include ` 且編譯連結 `-lm` (GCC)。
  • 單次查詢用試除法足夠;多次查詢或大範圍請用篩法預先計算。

修正邏輯錯誤並加上標頭檔,程式即可正確輸出區間質數個數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved