埃拉托色尼筛法,ArrayIndexOutOfBoundsException,输出为合数
Sieve of Eratosthenes, ArrayIndexOutOfBoundsException, output is composite number
我尝试编写埃拉托色尼筛法算法,我收到 ArrayIndexOutOfBoundsException 但我似乎不明白为什么,如果我更改限制,在打印时它只显示合数,如果可以的话,下面的代码会有所帮助.
public static Boolean[] solution(int N) {
Boolean[] isPrime = new Boolean[N];
isPrime[0] = false;
for(int i = 1; i <= N; i++) {
isPrime[i] = true;
}
for(int i = 2; i <= N; i++) {
if(isPrime[i]== true) {
System.out.println(i);
for(int j = 2; (j * i) < N; j++) {
int k = j * i;
isPrime[k] = false;
}
}
}
return isPrime;
i <= N;
导致错误
for(int i = 1; i <= N; i++) {
isPrime[i] = true;
}
例如
如果 N=4
那么当 i=4
时你会得到错误。 isPrime[4]
导致 OutOfBounds
异常,因为长度为 4.arrays 是基于零索引的。所以您可以访问的最大索引是 3.isPrime[3]
您可以通过将循环更改为 for(int i = 1; i < N; i++) {
来避免此错误
但是我不确定埃拉托色尼算法是什么。我希望你能改变你的代码记住数组是基于零索引的
Boolean[N]
创建一个包含 N 个元素的数组,因此,由于索引从 0 开始,因此最后一个索引是 N-1。
错误是for循环中的i<=N
引起的
我尝试编写埃拉托色尼筛法算法,我收到 ArrayIndexOutOfBoundsException 但我似乎不明白为什么,如果我更改限制,在打印时它只显示合数,如果可以的话,下面的代码会有所帮助.
public static Boolean[] solution(int N) {
Boolean[] isPrime = new Boolean[N];
isPrime[0] = false;
for(int i = 1; i <= N; i++) {
isPrime[i] = true;
}
for(int i = 2; i <= N; i++) {
if(isPrime[i]== true) {
System.out.println(i);
for(int j = 2; (j * i) < N; j++) {
int k = j * i;
isPrime[k] = false;
}
}
}
return isPrime;
i <= N;
导致错误
for(int i = 1; i <= N; i++) {
isPrime[i] = true;
}
例如
如果 N=4
那么当 i=4
时你会得到错误。 isPrime[4]
导致 OutOfBounds
异常,因为长度为 4.arrays 是基于零索引的。所以您可以访问的最大索引是 3.isPrime[3]
您可以通过将循环更改为 for(int i = 1; i < N; i++) {
但是我不确定埃拉托色尼算法是什么。我希望你能改变你的代码记住数组是基于零索引的
Boolean[N]
创建一个包含 N 个元素的数组,因此,由于索引从 0 开始,因此最后一个索引是 N-1。
错误是for循环中的i<=N