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

C 語言質數篩選邏輯錯誤:`!i%j` 運算子優先級導致判斷失效,加上括號 `!(i%j)` 即可修正

     編輯:程式設計疑難解答

代碼:


if (!i%j) break; // 錯誤

錯誤分析

C 語言運算子優先級:`%` > `!`。`!i%j` 等價於 `(!i) % j`。`i` 為非零整數,`!i` 為 0,`0 % j` 恆為 0,`if(0)` 永不成立,`break` 永不執行,內層迴圈跑完,所有數字都被判定為質數並輸出。

正確寫法


if (!(i % j)) break; // 明確優先計算餘數,再邏輯非
// 或
if (i % j == 0) break; // 更直觀:能整除即非質數

完整修正程式


#include 
int main() {
    for (int i = 2; i < 100; i++) {
        int j;
        for (j = 2; j < i; j++) {
            if (i % j == 0) break;
        }
        if (j == i) printf("%d\n", i);
    }
    return 0;
}

補充優化

  • 內層迴圈上限可優化為 `j * j <= i` 或 `j <= sqrt(i)`,大幅減少除法運算。
  • 更高效算法:埃拉托斯特尼篩法(Sieve of Eratosthenes),時間複雜度 O(n log log n)。

核心教訓:**複合條件務必加括號明確優先級**,養成 `if ((a % b) == 0)` 風格,避免隱性 Bug。

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