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

Java求101-200素數邏輯錯誤:假設為真再驗證的正確模式

     編輯:程式設計綜合問答

錯誤代碼分析

for (int a = 101; a < 200; a += 2) {
    for (int b = 2; b < a; b++) {
        if (a % b != 0) {        // 錯誤:只要一次不可整除就打印
            System.out.println(a);
            i++;
        } else {
            break;
        }
    }
}

邏輯缺陷:a=105時,b=2不可整除 → 打印105、計數+1;b=3可整除 → break。導致非素數被多次打印、計數錯亂。

正確邏輯:假設是素數,嘗試證偽

int count = 0;
for (int a = 101; a <= 200; a++) { // 含200
    boolean isPrime = true; // 假設為真
    for (int b = 2; b * b <= a; b++) { // 只需驗證到√a
        if (a % b == 0) { // 找到因子 → 證偽
            isPrime = false;
            break;
        }
    }
    if (isPrime) {
        System.out.println(a);
        count++;
    }
}
System.out.println("素數個數: " + count);

關鍵修正點

  1. 標誌變量初始化在外層循環:每個a重新假設isPrime=true。
  2. 內層循環尋找反例:if (a % b == 0)表示不是素數,設置標誌false並break。
  3. 外層判斷標誌輸出:內層跑完isPrime仍為true才是素數。
  4. 優化上限:b * b <= a等價b <= Math.sqrt(a),避免浮點運算。

進階優化:6k±1模式

boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (int i = 5; i * i <= n; i += 6)
        if (n % i == 0 || n % (i + 2) == 0) return false;
    return true;
}

輸出結果驗證

101-200間素數共21個:101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199。

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