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

Java 求 1-100 質數和:邏輯錯誤修正與效能優化

     編輯:程式設計綜合問答

原始碼中 flag 變數未在外層迴圈重置,導致第一個質數後所有數字都被判定為非質數。修正核心:每次外層迴圈開始前將 flag 重置為 true,且內層迴圈條件優化為 j*j <= i 或 j <= Math.sqrt(i)。

錯誤代碼

boolean flag = true; // 錯誤:只初始化一次
for (int i = 2; i <= 100; i++) {
    for (int j = 2; j <= i; j++) { // 應為 j < i 或 j*j <= i
        if (i % j == 0) { flag = false; break; }
    }
    if (flag) sum += i;
}

修正版

int sum = 0;
for (int i = 2; i <= 100; i++) {
    boolean flag = true; // 關鍵:每個 i 重新初始化
    for (int j = 2; j * j <= i; j++) { // 優化:只需判斷到 sqrt(i)
        if (i % j == 0) { flag = false; break; }
    }
    if (flag) sum += i;
}
System.out.println(sum); // 輸出 1060

進階優化:埃拉托斯特尼篩法

int n = 100;
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
    if (isPrime[i]) {
        for (int j = i * i; j <= n; j += i) isPrime[j] = false;
    }
}
int sum = 0;
for (int i = 2; i <= n; i++) if (isPrime[i]) sum += i;
System.out.println(sum); // 1060,時間複雜度 O(n log log n)

關鍵點總結

  • 質數定義:大於 1 的自然數,除 1 和本身外無其他因數。
  • 判斷迴圈上限:j <= Math.sqrt(i) 或 j*j <= i 即可,因為因數成對出現。
  • 旗標變數作用域:必須在外層迴圈內部宣告/重置,否則污染後續判斷。
  • 篩法適用於大範圍(如 1~10^7)質數統計,單次判斷用試除法即可。

修正旗標重置與迴圈邊界,是解決質數判斷邏輯錯誤的關鍵。

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