【问题标题】:Calculate the nearest prime number to another number without arrays计算最接近的素数到另一个没有数组的数字
【发布时间】:2018-03-26 21:13:32
【问题描述】:

我有这个作业但是我做不完,因为我只能使用关系运算符和 if-else/while,我不能使用库和方法,只有关系运算符和 If 或 while,我开始检查 If限制的数字是素数,首先检查 If / by 2 3 5 7 and 11 after that I try % with each number before the square root of the number (以确定它是否是素数) 但它只需要很多这样做的时间,我怎么能用更少的时间来计算它,对不起英语和罕见的解释。

【问题讨论】:

  • 听起来更像是一个数学问题,看看这个mathworld.wolfram.com/PrimalityTest.html 并选择一种算法,用 Java 或 Google 实现其中一种算法的 Java 实现
  • 你的问题很难理解。但这是一个事实。如果您需要您的代码快速,您将不得不使用数组(和筛算法)或涉及一些复杂数学的概率素性测试。您确定您的老师要求您提供一个快速的程序吗?我怀疑他/她没有....而您只是在为自己过日子!
  • 从老师的角度来看,这个练习的重点是让学生学会使用算术、关系运算符和简单的控制结构来编写程序。寻找素数的快速算法几乎肯定超出了编程入门课程的范围。我的建议:按照要求去做,把节省下来的时间花在学习其他东西上。
  • 如果你好奇,这里有一个概率素性测试的链接:en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test 但这通常只用于比整数范围大得多的数字,因为基本方法比它快。

标签: java math primes


【解决方案1】:

据我所知,如果没有数组,拥有某种 Eratosthenes 筛子的唯一其他选择(希望比试验部门的素性测试具有更好的复杂性)是惰性列表,它可以用生成器来模拟.在伪代码中,

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] )

我们只取它产生的 first 数字。这里的 union 当然是一个 ordered 的,给定 ordered,增加源,以有序的方式产生结果,一个接一个将较小的值转换为较大的值。

平方根的两倍用于覆盖范围内最大的prime gap。您可以通过为您的范围找到主要差距的精确值来使其更精确。 psq 素数可以通过试除法找到,也可以在生成器中一一计算。

但是现在您需要以某种方式在某处维护这个生成器集合[s,s+p..],并且仍然禁止使用数组。

链表是一种可能性。它也可以被模拟,嵌套 递归函数,每个函数都有本地静态存储 closures,在初始化时创建它们的链,如

           = [n..] \ 
              ( [s1,s1+p1..] ∪
                ( [s2,s2+p2..] ∪
                  ( [s3,s3+p3..] ∪ (.... [sk,sk+pk..] ....))))

您可以在 Go 中看到 something just like this 的示例,here(和 a faster one),尽管它实现了 \s 链(没有 ∪s),

   = (((....( [n..] \ 
                [s1,s1+p1..] ) \
                  [s2,s2+p2..] ) \
                    [s3,s3+p3..] ) \  ....) \ [sk,sk+pk..] 

这可能更容易做到。

∪s 虽然可以安排in a tree,为额外的complexity advantage。也许是一个有趣的项目。

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 2012-11-17
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多