【问题标题】:is_prime? in Ruby. Need a second opinion是素数吗?在红宝石。需要第二意见
【发布时间】:2013-11-03 23:09:04
【问题描述】:

我一直在研究 ruby​​ 并且一直在做一些 ruby​​ 练习来看看我知道多少(这不是很多)。这是我遇到的一个问题:

问:编写一个方法 is_prime?,它接受一个数字 num,如果它是素数则返回 true,否则返回 false。

您可能希望使用模运算:5 % 2 在将 5 除以 2 时返回余数: 1. 如果 num 可被 i 整除,则 num % i == 0。(您不会期望已经知道关于挑战的模数)

这个问题也有答案,那就是。

答:

# Works for values greater than 1

def is_prime?(num)
  i = 2
  while i < num
    is_divisible = ((num % i) == 0)

    if is_divisible
      # divisor found; stop and return false!
      return false
    end

    i += 1
  end

  # no divisors found
  true
end

这是我想出的:

毫安:

def is_prime?(num)
  if num % 2 == 0
    puts "false"
  else 
    puts "true"
  end
end

由于我的答案与答案完全不同,我可以找人支持我,看看我是否走在正确的轨道上。谢谢。

【问题讨论】:

  • 您的解决方案有一个小问题:is_prime?(2) => "false"。开始here
  • 旁注,除了答案中迄今为止解决的问题外,您的函数应该返回真或假,而不是将其打印为字符串

标签: ruby-on-rails ruby primes


【解决方案1】:

您的解决方案仅检查数字是否为偶数,并且正如 Cary Swoveland 指出的那样,会错误地将 2 识别为非素数。您还会错误地将 9 或 15 等数字识别为素数。

您可以做一些事情来大大加快所提供的解决方案:

  1. 检查 num 不能被 2 整除后,您只需要 检查超过该点的奇数。增加你的候选人 除以 2 而不是 1。
  2. while循环的上限,你最大的候选除数 需要检查的是Math.sqrt(num)。任何大于num 的因子 比平方根有一个小于 平方根,所以看更大的没有意义 候选人。

【讨论】:

  • #2 的证明:x = Math.sqrt(num).to_i。如果n &gt; xnum 的因子,那么num/nnum/n = x*num/x*n &lt; x*num/x*x = x 也是。
【解决方案2】:

开始编写自动化测试。具体...

assert{ 5.is_prime }
deny{ 6.is_prime }
assert{ 7.is_prime }
deny{ 8.is_prime }
deny{ 9.is_prime }

如果您的is_prime 使用return true 而不是print "true",我的最后一个断言会破坏它。 (我在这里使用了错误的库,但您可以使用 assert_true() 随您的 test/unit 库提供的任何断言。)

继续添加断言,并在代码中断时修复代码,直到您的代码看起来像该代码。然后查找“埃拉托色尼筛法”的标准实现,了解为什么该代码效率低下!

【讨论】:

【解决方案3】:

您的解决方案仅适用于确定一个数字是否可以被 2 整除。

例如,输入值 9 会导致您的函数返回 true,即使 9 不是素数。它需要迭代所有可能的因素,而不仅仅是 2,就像在示例解决方案中那样。

【讨论】:

    【解决方案4】:

    要通过尝试除法来做到这一点,这似乎是您想要做的,最简单的方法是从 i=2 开始并执行 i % num == 0。然后在 i 为时连续将 i 递增 1小于 num。

    此外,要使此功能适用于负数,请检查是否 num

    优化一:(简单) 不要一直到数字。只能达到数字的平方根。 要轻松完成此操作,请设置循环条件 (i*i

    优化2:(具有挑战性) 从 3 开始,然后增加 2,因为任何能被 2 整除的数字都不能是素数。当然除了 2 个。

    要完成这项工作,您需要在代码开头添加另外两个检查(阅读:if 语句)。第一个检查是否(num == 2)。如果是,则返回 true。第二个检查是否(num % 2 == 0)。如果是,则返回false;

    优化3:(困难) 你只需要检查素数。如果您生成并存储素数列表,则可以使用这些素数快速找到远大于列表中最高素数的素数。了解优化 2 后,您将能够非常轻松地编写此代码。

    一旦你掌握了试验师,你可能想看看埃拉托色尼筛法。这是很酷的豆子,而且不太难理解。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多