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

Java 計算第 m 到第 n 個質數之和:陣列索引邏輯修正

     編輯:程式設計綜合問答

原始程式碼問題

int a[] = new int[200];
for (int i = 1; i < 200; i++) {
    // ... 判斷質數
    if (isPrime) {
        a[i-1] = i; // 錯誤:非質數位置留下 0,導致陣列稀疏
    }
}
// 後續直接用 a[0]..a[m-1] 會包含大量 0

核心錯誤

質數存入陣列時使用 a[i-1],導致非質數索引位置保留預設值 0,陣列前段出現大量 0,後續求和時索引錯位。

修正程式碼

public class PrimeSum {
    public static void main(String[] args) {
        int[] primes = new int[200];
        int count = 0;

        // 1. 收集質數到陣列前段,無間隙
        for (int i = 2; i < 200; i++) { // 從 2 開始,1 非質數
            if (isPrime(i)) {
                if (count < primes.length) {
                    primes[count++] = i;
                }
            }
        }

        // 2. 讀取 m, n
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入 m (起始第幾個質數): ");
        int m = sc.nextInt();
        System.out.print("輸入 n (結束第幾個質數): ");
        int n = sc.nextInt();

        // 3. 邊界檢查
        if (m < 1 || n > count || m > n) {
            System.out.println("範圍錯誤:目前共找到 " + count + " 個質數");
            return;
        }

        // 4. 計算第 m 到第 n 個質數之和 (索引 m-1 到 n-1)
        long sum = 0;
        System.out.print("質數列表: ");
        for (int i = m - 1; i < n; i++) {
            sum += primes[i];
            System.out.print(primes[i] + (i < n - 1 ? ", " : ""));
        }
        System.out.println("\n總和 = " + sum);
    }

    private static boolean isPrime(int num) {
        if (num < 2) return false;
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}

關鍵修正點

  1. 獨立計數器 count:質數寫入 primes[count++],確保陣列前 count 格**連續、無零值**。
  2. 索引轉換:第 k 個質數對應陣列索引 k-1。
  3. 邊界檢查:防止 m, n 超出實際找到的質數總數。
  4. 效能優化:判斷質數只需試除到 sqrt(num) (i * i <= num)。

進階:動態產生質數 (無上限)

public static List generatePrimes(int requiredCount) {
    List primes = new ArrayList<>();
    int num = 2;
    while (primes.size() < requiredCount) {
        if (isPrime(num)) primes.add(num);
        num++;
    }
    return primes;
}

使用 ArrayList 彈性擴容,避免預估陣列大小不足。

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