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

C++ 求區間素數代碼邏輯錯誤修正與優化實現

     編輯:程式設計綜合問答

原代碼核心問題

  • 特殊處理 2 的邏輯缺失,導致輸入 1~100 時輸出 1 而非 2
  • 循環條件 m < b 應為 m <= b 以包含上界
  • 素數判定變量 sign 未重置,內層循環 break 後外層邏輯混亂
  • 缺少 <cmath> 頭文件,sqrt 未聲明

修正後完整代碼

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    long a, b, l = 0;
    cout << "Please input two numbers (a b): ";
    cin >> a >> b;
    cout << "Primes from " << a << " to " << b << endl;

    // 確保下界至少為 2
    if (a < 2) a = 2;

    for (long m = a; m <= b; ++m) {
        int sqrtm = static_cast<int>(sqrt(static_cast<long double>(m)));
        bool isPrime = true;

        for (int i = 2; i <= sqrtm; ++i) {
            if (m % i == 0) {
                isPrime = false;
                break;
            }
        }

        if (isPrime) {
            if (l++ % 10 == 0) cout << endl;
            cout << setw(5) << m;
        }
    }
    cout << endl;
    return 0;
}

關鍵修正點解析

問題修正說明
1 被誤判為素數if (a < 2) a = 2;素數定義為大於 1 的自然數
上界不包含m <= b符合「從 A 到 B」的自然語義
標誌位未重置每輪外層循環 bool isPrime = true;避免上一輪殘留影響本輪判定
類型轉換不安全static_cast 顯式轉換消除隱式轉換警告,提升可移植性

進階優化建議

  1. 埃拉托斯特尼篩法:對大範圍(如 1~1,000,000)顯著提速,時間複雜度 O(n log log n)。
  2. 位運算優化:用 bitset 或動態位圖存儲標記,降低 8 倍內存佔用。
  3. 分段篩法:超大範圍(>10^9)分塊處理,適應緩存架構。

編譯運行驗證

$ g++ -std=c++17 -O2 prime.cpp -o prime
$ ./prime
Please input two numbers (a b): 1 100
Primes from 2 to 100
    2    3    5    7   11   13   17   19   23   29
   31   37   41   43   47   53   59   61   67   71
   73   79   83   89   97

掌握邊界條件處理、標誌位管理、類型安全,編寫正確高效的 C++ 素數篩選程序不再是難題。

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