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

这个程序使用埃拉托斯特尼的筛子吗?

黎曾笑
2023-03-14

我的任务如下:使用埃拉托斯特尼筛来定位并打印出从1到1000的所有素数。

遵循与此类似的过程:

    < li >按顺序写下所有需要考虑的数字。 < li >划掉1,因为它不是质数。 < li >转到未删除的下一个号码;留下它,但是划掉那个数字的所有倍数。 < li >重复步骤3,直到您超过所考虑的最大值的一半。在这一点上,所有没有被划掉的数字都是期望的素数。

您的算法可能与上述算法略有不同,但速度很重要。

我用我所掌握的数学和数组知识编写了这个程序,但当我在研究Sieve时,我不知道这是否是一种方法。

public class PrimeSieve
 {

     public static void main( String[] args) 
     { 
         int max=1000;
         calcPrimes( max ); 
        } 

        public static void calcPrimes( int max ) 
        { 
            // each boolean value indicates whether corresponding index 
            // position is composite (non-prime) 
            boolean[] array = new boolean[max +1 ]; 

            // mark composites as true 
             for (int i = 2; i <= (int) Math.sqrt( max ); i++) 
             {
                 for (int j = i*i; j <= max; j += i) array [j ] = true; 
                 {

             // print indexes with corresponding false values 
                    for (int k = 2;k <= max; k++) 
                    {

                        if ( !array[ k ] ) 
                        System.out.format( k + "\n" ); 
                    }

                }
            }
      } 
} 

任何帮助都很好!

共有1个答案

温亮
2023-03-14

问题是,在打印结果之前,您没有完成划分组合的过程,这可能是因为您的循环以一种混乱的方式嵌套。

public static void calcPrimes(int max) {
    // each boolean value indicates whether corresponding index
    // position is composite (non-prime)
    boolean[] array = new boolean[max + 1];

    // mark composites as true
    for (int i = 2; i <= (int) Math.sqrt(max); i++) {
        for (int j = i*i; j <= max; j += i) array[j] = true;
    }

    // print indexes with corresponding false values
    for (int k = 2; k <= max; k++) {
        if (!array[k]) System.out.println(k);
    }
}

在这个例子中,我移动了代码来打印执行筛选的循环之外的素数。

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

  • 我正在尝试实现筛选算法,它会询问连续数字列表的大小,并打印出该列表中的素数,但我收到了一个seg错误:11错误。 这是我的代码:

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

  • 在一个类作业中,我被要求用Java编写Eratostenes筛选代码,我的代码效率非常低。运行时间不长,但我相当肯定,除了像我一样列出所有内容外,还有其他循环的空间。。 这是我的代码: 基本上,我所做的是将所有不是质数的元素设置为true… 所以我的主要2个问题是1。有没有办法实现一个循环,使代码更短2。如何打印此数组中所有为 true(质数)的元素

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

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