【发布时间】:2013-03-06 14:51:53
【问题描述】:
我遇到了一个需要使用数组的分配问题。我需要创建埃拉托色尼筛算法并打印出所有素数。我很困惑,因为据我所知,我的操作顺序是正确的。代码如下:
//Declare the array
boolean numbers [] = new boolean[1000];
int y = 0;
//Declare all numbers as true to begin
for(int i = 2; i < 1000;i++){
numbers[i] = true;
}
//Run loop that increases i and multiplies it by increasing multiples
for (int x = 2; x < 1000; x++) {
//A loop for the increasing multiples; keep those numbers below 1000
//Set any multiple of "x" to false
for(int n = 2; y < 1000; n++){
y = n * x;
numbers[y] = false;
}
}
我首先将数组中的所有数字设置为 true。然后第二个循环将从 2 开始“x”,然后在它内部是一个嵌套循环,它将“x”乘以“n”的值,并且“n”将继续增加,只要该乘法的乘积(“y ") 低于 1000。一旦 "y" 达到最大值,"x" 将上升一个数字,并重复该过程,直到所有非质数都设置为 false。
这是我编写代码时的逻辑,但是当我尝试运行它时,我得到了“ArrayIndexOutOfBoundsException”错误。据我所知,我将所有内容都设置为低于 1000,因此它不应该超过数组大小。
我知道它可能不是最有效的算法,因为随着“x”的增加,它会超过它已经超过的数字,但它是我能想到的最简单的一种。
【问题讨论】:
-
看看你对变量
y的索引,它的值很容易超过1000。 -
此外,您的内部 for 循环正在针对 x 而不是 n 进行测试,这意味着 n 永远不会被绑定,并且会在内部循环中无限继续,即使 y 问题也会导致数组越界上面提到的不存在。
-
对不起,嵌套循环应该说 y
标签: java sieve-of-eratosthenes