【问题标题】:Sieve of Eratosthenes Issue Java埃拉托色尼筛问题 Java
【发布时间】: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


【解决方案1】:

这里:

        for(int n = 2; y < 1000; n++){
        y = n * x;
        numbers[y] = false;
        }

首先检查y &lt; 1000,然后然后初始化并使用它。这是错误的方法。

此外,只有当x 为素数时,您才可以运行上述循环。这不会影响正确性,但应该会使您的代码更快。

【讨论】:

  • 我知道我哪里出错了。我添加了 if(y &lt; 1000) 然后 numbers[y] = false; 非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多