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;
}
}
count:質數寫入 primes[count++],確保陣列前 count 格**連續、無零值**。k 個質數對應陣列索引 k-1。m, n 超出實際找到的質數總數。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 彈性擴容,避免預估陣列大小不足。