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

没有阵列的厄拉多塞之筛?

欧阳何平
2023-03-14

我必须为'sieve of eratosthenes'算法编写一个java代码,以便在控制台上打印出给定最大值的素数,但我不被允许使用数组。我们的教授告诉我们,只有在循环的帮助下才能做到这一点。

所以我想了很多,在谷歌上搜索了很多关于这个话题的信息,但都找不到答案。我认为这根本不可能,因为你已经把那些数字已经被划掉的信息存储在某个地方了。

我的代码到现在为止:

public static void main(String[] args) {
    int n = 100;
    int mark = 2;

    System.out.print("Primes from 1 to "+n+": 2, ");
    for (int i = 2; i <= n; i++) {
        if(i % mark != 0){
            System.out.print(i+", ");
            mark = i;
        }
    }
}

-

但是如果有一个解决方案,如果有人能和我分享,我会很高兴!:)

这个解决方案可以用其他编程语言编写,如果可能的话,我可以自己把它翻译成java。

提前感谢您和最好的问候

更新:非常感谢大家,我真的很感激你的帮助,但我认为基本结构无法完成。我见过的所有通过使用基本结构打印出素数的算法都不是埃拉托斯特尼的筛子。:(

共有2个答案

邵崇凛
2023-03-14

我收回了我之前说过的话。这是哈斯克尔中没有数组的“筛子”:

筛限=[n|n

这是一个健忘的筛子,效率非常低。只使用加法和整数比较。其中的列表推导可以用命令式语言重新编码为循环。或者换句话说,它像筛子一样移动计数,但不标记任何东西,因此不使用数组。

当然,你是否认为它是一个“真正的”筛子取决于你对筛子的定义是什么。这个不断地重新创造和抛弃它们。或者你可以说它重新实现了rem函数。实际上,这是同样的事情,并且涉及到为什么当重用(通常通过数组) 成为可能时,筛子突然变得如此高效。

柳宏深
2023-03-14

筛子是关于记住你已经找到的素数。据我所知,没有数组或列表,只有循环,就没有办法做到这一点。
我随机检查了RosettaCode的一些示例,没有找到一个没有数组和只有循环的示例。

如果您将类和方法添加为选项,您可以提出递归设计:

public class Sieve
{

    private int current;
    private int max;
    private Sieve   parent;

    public Sieve(int current, int max, Sieve parent )
    {
        this.current = current;
        this.max = max;
        this.parent = parent;
    }

    public static void main(String[] args)
    {
        int n = 100;

        System.out.print("Primes from 1 to " + n + ":\n");

        printPrimes(n);
    }

    private static void printPrimes(int i)
    {
        new Sieve(2,i,null).start();    
    }

    private void start()
    {
        if(current <2 || max <2)
        {
            return;
        }

        if(this.current > max)
        {
            parent.print();
            return;
        }

        for(int i = this.current+1;current<=max+1;i++)
        {
            if(this.testPrime(i))
            {
                new Sieve(i,this.max,this).start();
                return;
            }
        }
    }

    private boolean testPrime(int i)
    {
        if(i%this.current != 0)
        {
            if(this.parent == null)
            {
                return true;
            }
            else
            {
                return this.parent.testPrime(i);
            }
        }
        return false;
    }

    private void print()
    {
        if(this.parent != null)
        {
            this.parent.print();
        }

        System.out.print(" "+this.current);
    }


}

这将删除数组,但使用对象来存储素数(每个筛子包含一个素数)

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

  • 我有一个问题,我有一个需要使用数组的赋值。我需要创建埃拉托斯特尼筛算法并打印出所有素数。我很困惑,因为据我所知,我的操作顺序是正确的。代码如下: 我首先将数组中的所有数字设置为true。然后第二个循环将从2开始“x”,然后在其中是一个嵌套循环,它将“x”乘以“n”的值,并且只要乘积(“y”)小于1000,“n”就会继续增加。一旦“y”达到最大值,“x”就会增加一个数字,重复该过程,直到所有非质数都

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

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

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

  • 下面是两种主要的方法。 代码: