一尘不染

没有阵列的Eratosthenes筛?

algorithm

我必须为“
eratosthenes筛子”算法编写一个Java代码,以在控制台上打印出达到给定最大值的素数,但不允许使用数组。我们的教授告诉我们,只能在循环的帮助下进行操作。

因此,我对此进行了很多思考并在Google上进行了大量搜索,但找不到答案。我认为这根本不可能,因为您已经在某处存储了哪些数字已经划掉的信息。

直到现在我的代码:

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;
        }
    }
}

->因此,我不允许对数字进行“ i%mark!= 0”命令,该数字是我已经打印的数字的倍数,但是如果没有数组,我应该如何弄清楚这一点,在数组上我可以删除数字索引?

但是,如果有解决方案,我很高兴有人可以与我分享!:)

该解决方案可以使用其他编程语言,如果可能的话,我可以将其自己翻译为java。

在此先感谢您和最诚挚的问候


更新:非常感谢大家,我非常感谢您的帮助,但我认为使用基本结构无法做到。我见过的所有使用基本结构打印出质数的算法都不是橡皮擦的筛子。:(


阅读 247

收藏
2020-07-28

共1个答案

一尘不染

我要收回我刚才说的话。这就是Haskell中没有数组的“筛子”:

sieve limit = [n | n<- [2..limit], null [i | i <- [2..n-1], j <- [0,i..n], j==n]]

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

当然,您是否将其视为“真”筛子取决于您对筛子的定义。这个不断地创造和放弃他们。或者您可以说它重新实现了该 rem
功能。实际上,这是同一句话,并且说明了当可 重复使用 (通常通过数组)成为可能时,筛子突然变得如此高效的本质。

2020-07-28