我必须为“ 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。
在此先感谢您和最诚挚的问候
更新:非常感谢大家,我非常感谢您的帮助,但我认为使用基本结构无法做到。我见过的所有使用基本结构打印出质数的算法都不是橡皮擦的筛子。:(
我要收回我刚才说的话。这就是Haskell中没有数组的“筛子”:
sieve limit = [n | n<- [2..limit], null [i | i <- [2..n-1], j <- [0,i..n], j==n]]
这是个 健忘的 筛子,效率 非常 低下。仅使用加法和整数比较。列表理解可以用命令式语言重新编码为循环。或者换句话说,它像筛子一样 移动 计数,但是没有标记任何东西,因此不使用数组。
当然,您是否将其视为“真”筛子取决于您对筛子的定义。这个不断地创造和放弃他们。或者您可以说它重新实现了该 rem 功能。实际上,这是同一句话,并且说明了当可 重复使用 (通常通过数组)成为可能时,筛子突然变得如此高效的本质。
rem