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

使埃拉托斯特尼筛更有效

夏飞鹏
2023-03-14

在一个类作业中,我被要求用Java编写Eratostenes筛选代码,我的代码效率非常低。运行时间不长,但我相当肯定,除了像我一样列出所有内容外,还有其他循环的空间。。

这是我的代码:

public class test
{

    public static boolean[] myArray()
    {
        boolean[] myArray = new boolean[100];
        for(int i = 1;i <100; i++)
        {
                if(i % 2 ==0)
                    {
                        myArray[i] = true;
                    }
                if(i % 3 ==0)
                    {
                        myArray[i]= true;
                    }
                if(i % 5 ==0)
                {
                    myArray[i]= true;
                }
            if(i % 7 ==0)
                {
                    myArray[i]= true;
                }
            if(i % 11 ==0)
                {
                    myArray[i]= true;
                }
        }
        myArray[2]=false;
        myArray[3]=false;
        myArray[5]=false;
        myArray[7]=false;
        myArray[11]=false;

        return myArray;
    }       
}

基本上,我所做的是将所有不是质数的元素设置为true…

所以我的主要2个问题是1。有没有办法实现一个循环,使代码更短2。如何打印此数组中所有为 true(质数)的元素

共有2个答案

谯乐池
2023-03-14

你在这里做的是将2、3、5、7和11的所有倍数标记为true,然后将这些数字本身设置为false,但你要做100次。

您需要为筛子做以下工作:

最初,所有的数字都是“质数”,直到被标为合数。

    < li >将数组中的所有数字标记为< code>true,即“迄今为素数”。 < li >在< code>for循环中,如果该数字仍然< code>true,则它是质数。从该数字的两倍开始,将它的所有倍数标记为< code>false表示合成。您可以为此使用一个内部循环。 < li >否则,如果该数字为< code>false,则它是复合的,并且它的倍数也已经标记为复合的。 < li >迭代完< code>100、< code>10的平方根后,停止< code>for循环。这种优化是可能的,因为您不会找到更多的数字来标记composite。如果此处的数字是复合数字,并且是大于< code>10的倍数,那么还有一个小于< code>10的因子已经将该数字标记为复合数字。
锺离声
2023-03-14

我希望这有帮助。无论如何,筛子是一个很长的话题:

public class test
{

    public static boolean[] myArray(int MAX)
    {
        boolean[] myArray = new boolean[MAX+1];
        // myArray[i] == false iff i is prime
        for(int i = 2; i*i <= MAX; i++) // optimization: i*i to not check repeated divisors
        {
            if (!myArray[i]) // if i is prime
                for (int j=i+i; j <= MAX; j += i) // mark all its multiples as not prime
                    myArray[j] = true;
        }
        return myArray;
    }    

    public static void print(int[] myArray) { // print the array once computed
        for (int i=2; i< myArray.length; ++i)
            if (!myArray[i])
                System.out.println(i+" is prime");
    }   
}

附注:代码未经测试。

 类似资料:
  • 我正在尝试编写一个程序来实现对埃拉托西的筛选。我可以从2到任何给定的结束编号,但我们正在处理的赋值要求我们输入起始值。我完全被卡住了。我试过很多不同的代码,但它总是给我奇怪的答案。 我的起点是起始值,终点是结束值。我基本上想找到这个范围的素数。谢谢!!!

  • 做一个简单的筛子很容易: 但是当N非常大并且我无法在内存中持有这种数组时,该怎么办?我已经查找了分段筛方法,它们似乎涉及查找素数,直到sqrt(N),但我不明白它是如何工作的。如果 N 非常大(比如 10^18)怎么办?

  • 我在我的一个班级里做的一个作业,我们必须实现一个厄拉多塞的筛子。我已经尝试了七次来得到一个有效的代码,并且尝试了整合我研究过的许多解决方案。我终于有一个可以输出数字的了。不幸的是,它同时打印合数和质数,但不打印2。 我的代码如下: 我怀疑我的循环有问题。我修复了前两个循环的和变量,以便它从2开始打印出来,问题似乎是在我将数组初始化为true后,它没有将合数标记为。 提前感谢你的帮助。

  • 我正在实现一个相当快的质数生成器,我得到了一些不错的结果,在埃拉托斯特尼的筛子上进行了一些优化。特别是,在算法的初步部分,我以这种方式跳过2和3的所有倍数: 这里是一个根据埃拉托色尼筛的布尔数组。我认为这是一种只考虑质数2和3的轮式因式分解,按照模式2、4、2、4递增。. 我想做的是实现一个更大的轮子,也许考虑素数2,3和5。 我已经阅读了很多关于它的文档,但我没有看到任何使用埃拉托斯特尼筛子的实

  • 我正在尝试解决spoj上的Prime Path问题,我正在尝试理解在github上找到的解决方案。解决这个问题的广义逻辑是生成所有四位数素数,并添加一个边,如果我们可以通过更改一个数字从一个素数转到下一个素值。我找到的这个解决方案使用筛子来生成所有素数。与此解决方案中的筛分功能相比,维基上的稀土筛分功能有所不同。只需要帮助了解以下代码中筛分函数的变化: 这里的筛选函数计算是什么?我无法理解为什么作

  • 我在python中找到了一个示例代码,它给出了直到< code>n的所有素数,但我就是不明白,为什么它会这样做? 我读过维基百科上关于埃拉托色尼筛子的文章,但根本不知道它是如何工作的。 请解释一下循环是如何工作的。 EDIT-发现代码都错了,因为它表示25为素数,通过更深入的搜索发现这不是筛子,有人能展示一个利用python中筛子的生成器并解释它吗