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

C++ 求素數和 Bug:flag 變量未重置導致合數後素數漏加

     編輯:程式設計綜合問答

錯誤代碼片段


int flag = 1;
while (N--) {
    cin >> i;
    for (int cnt = 2; cnt < i/2+1; cnt++) {
        if (i % cnt == 0) { flag = 0; break; }
    }
    if (!flag == 0) { sum += i; flag = 1; } // flag 僅在素數分支重置
}

問題

遇到合數時 flag=0,若不進入 if (!flag==0) 分支,flag 永遠為 0,導致後續所有數字(包括素數)判斷失敗。

修正:每次循環開始重置 flag


while (N--) {
    cin >> i;
    int flag = 1; // 移入循環內部,每次重置
    for (int cnt = 2; cnt * cnt <= i; cnt++) { // 優化:sqrt(i)
        if (i % cnt == 0) { flag = 0; break; }
    }
    if (flag && i > 1) sum += i; // 1 不是素數
}

優化建議

  • 判斷素數上限用 cnt * cnt <= i 替代 i/2,複雜度從 O(N) 降為 O(√N)。
  • 預計算 1000 以內素數表(埃氏篩),多組測試數據直接查表 O(1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved