当前位置: 首页 > 知识库问答 >
问题:

厄拉多塞问题Java的筛子

叶冥夜
2023-03-14

我有一个问题,我有一个需要使用数组的赋值。我需要创建埃拉托斯特尼筛算法并打印出所有素数。我很困惑,因为据我所知,我的操作顺序是正确的。代码如下:

        //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”,然后在其中是一个html" target="_blank">嵌套循环,它将“x”乘以“n”的值,并且只要乘积(“y”)小于1000,“n”就会继续增加。一旦“y”达到最大值,“x”就会增加一个数字,重复该过程,直到所有非质数都设置为false。

这是我编写代码时的逻辑,但是当我尝试运行它时,我收到了“ArrayIndexOutOfBoundsException”错误。据我所知,我将所有内容都设置为低于1000,因此它不应该超过数组大小。

我知道这可能不是最有效的算法,因为随着“x”的增加,它将遍历已经遍历过的数字,但这是我能想到的最简单的算法。

共有1个答案

潘泰
2023-03-14

这里:

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

您首先检查< code>y

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

 类似资料:
  • 我选择了“使用C进行编程原理和实践”,并且正在做一个涉及埃拉托色尼筛的早期问题,我有意想不到的输出,但我无法确定问题到底是什么。这是我的代码: 这个问题目前只要求我使用这种方法找到最大100的质数。我还尝试使用当前的“goto”方法在某些情况下跳出双循环,我还尝试在检查循环之后使用带有if语句的布尔标志,并简单地使用“继续”语句,但都没有任何效果。 (老实说,我想既然人们说goto是邪恶的,也许它

  • 我必须为'sieve of eratosthenes'算法编写一个java代码,以便在控制台上打印出给定最大值的素数,但我不被允许使用数组。我们的教授告诉我们,只有在循环的帮助下才能做到这一点。 所以我想了很多,在谷歌上搜索了很多关于这个话题的信息,但都找不到答案。我认为这根本不可能,因为你已经把那些数字已经被划掉的信息存储在某个地方了。 我的代码到现在为止: - 但是如果有一个解决方案,如果有人

  • 我用Python2.7编写了一段代码,用于创建质数列表。代码是 这是否比埃拉托斯特尼筛更有效?我认为记忆效率应该更好,但我怀疑时间效率。如何计算时间和内存效率,以及如何对效率进行基准测试?

  • 我正在解决欧拉项目的一些问题,必须生成200万质数来解决一个问题。我对埃拉托色尼筛的实现非常慢,但我不知道为什么。有人能解释一下这个实现的主要问题吗?我觉得它很漂亮,然后我发现它非常糟糕:(。我在网上找到了它的另一个实现,它比我的快得多。 编辑:感谢所有的答案!结论是过滤器是问题所在,因为它会遍历每个元素(而不仅仅是那些被标记为非素数的元素),而且每次都会创建一个新列表。用旧的循环和一轮过滤重写它

  • 我应该编写一个函数或脚本,找出所有小于给定整数n的质数p 我意识到这与我应该写的代码相去甚远。但这是我想到的唯一想法,它只删除了可被2和3整除的数字,我需要找到所有素数,对每个entry.This重复这一点显然不明智。但我觉得可以为此创建一个循环。但我没有编写这个循环。请帮助我。

  • 2)Java的内置使用了两个锁:takeLock和putLock,并分别用在put()和take()中,我看到间隔队列是一个链表,不是线程安全的,那怎么行呢?