【发布时间】:2020-03-15 20:59:53
【问题描述】:
我正在尝试为 Eratosthenes 筛编写一个程序,它可以工作,但如果输入数字为 33 或更大,我会收到此错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:373)
at java.base/java.util.ArrayList.get(ArrayList.java:425)
at Main.main(Main.java:23)
这是我使用的代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
int nr = read.nextInt();
ArrayList<Integer> listA = new ArrayList<Integer>();
ArrayList<Integer> listB = new ArrayList<Integer>();
for (int i = 2; i <= nr; i++)
listA.add(i);
//System.out.println(listA);
int m = 2;
listB.add(m);
while (m <= nr-2) {
listA.removeAll(Arrays.asList(m));
for (int j = m*2; j <= nr; j = j + m) {
listA.removeAll(Arrays.asList(j));
}
m = listA.get(0);
listB.add(m);
}
System.out.println(listB);
}
}
【问题讨论】:
-
不需要
listA.removeAll(Arrays.asList(m));,因为您只删除了一个值。可以直接listA.remove(m)。就您的其余代码而言,我不确定您要完成什么。你可以只使用一个 for 循环和一个 boolean[] 你不需要两个 ArrayLists -
请指出您的代码的哪一行引发了异常
-
顺便说一句,最简单和最快的实现是巨大的
boolean[],但如果您的筛子很大(数百万),请使用BitSet,每个值仅使用 1 位。
标签: java sieve-of-eratosthenes