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

Java Applet 判斷素數和:修正迴圈起始值與 break 優化

     編輯:程式設計綜合問答

原始碼問題

for (int i = 0; i < j; i++) { // i=0 導致 j%0 拋 ArithmeticException
    if (j % i == 0) prime = false;
}

修正版

public void actionPerformed(ActionEvent e) {
    int a = Integer.parseInt(t1.getText());
    int b = Integer.parseInt(t2.getText());
    if (a > b) { int t = a; a = b; b = t; } // 確保 a <= b

    T1.setText(""); // 清空舊結果
    for (int j = a; j <= b; j++) {
        if (j < 2) continue; // 0,1 非質數
        boolean prime = true;
        for (int i = 2; i * i <= j; i++) { // 只需判斷到 sqrt(j)
            if (j % i == 0) { prime = false; break; }
        }
        if (prime) T1.append(j + " ");
    }
}

關鍵修正點

問題修正
i=0 除零異常改為 i=2,質數定義為大於 1 的自然數
迴圈至 j 效率低改為 i*i <= j (等價 i <= sqrt(j))
未 break發現因子立即 break 跳出內層迴圈
結果累積不換行T1.append(j + " ") 加空格分隔

進階:篩法 (大範圍更快)

boolean[] isPrime = new boolean[b+1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i*i <= b; i++)
    if (isPrime[i])
        for (int k = i*i; k <= b; k += i) isPrime[k] = false;
for (int j = a; j <= b; j++) if (isPrime[j]) T1.append(j + " ");

時間複雜度 O(n log log n),適合 b 較大 (如 10^6) 場景。

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