我有这个功课,但我无法完成它,因为我只能使用关系运算符和if-else / while,我不能使用库和方法,只能使用关系运算符和if或while,我开始检查If作为限制的数字是素数,首先检查是否/通过2 3 5 7和11,我在数字的平方根之前尝试%与每个数字(确定它是否为素数)但它只需要很多时间这样做,我怎么能用更少的时间来计算它,对不起英语和罕见的解释。
答案 0 :(得分:0)
没有阵列,我知道的另一种选择使用Eratosthenes筛选的任何其他选项(因为任何希望比试验分区的primality测试具有更好的复杂性)是懒惰列表,可以用生成器模拟。在伪代码中,
primes = [2..] \ [[p*p, p*p+p, ...] for p in primes]
以起点变为
primesFrom n = [n..] \ unionAll(
[[s,s+p..] for each p in psq
where psq = primes upto (2 * sqrt(n)),
where s = div(n+p-1, p) * p] )
我们只需要使用它生成的第一个号码。这里的 union 当然是一个有序的,给定有序,增加来源,以有序的方式产生结果,逐个来自较小的值,较大的值。
使用两倍的平方根,认为该范围内的最大eval()
被覆盖。您可以通过查找范围的主要间隙的精确值来使其更精确。 psq
素数可以通过试验分区找到,也可以在发电机中逐一进行。
但是现在你需要以某种方式维护这个生成器[s,s+p..]
的集合,并且仍然禁止使用数组。
链表是一种可能性。它也可以被模拟,嵌套的递归函数与每个 prime gap中的本地静态存储,在初始化时创建它们的链,如
= [n..] \
( [s1,s1+p1..] ∪
( [s2,s2+p2..] ∪
( [s3,s3+p3..] ∪ (.... [sk,sk+pk..] ....))))
你可以在Go,closures(和something just like this)中看到here的示例,尽管它实现了\
s的链(没有{{1} s),
∪
这可能是一件容易的事情。
= (((....( [n..] \
[s1,s1+p1..] ) \
[s2,s2+p2..] ) \
[s3,s3+p3..] ) \ ....) \ [sk,sk+pk..]
可以为a faster one安排in a tree。也许是一个有趣的项目。