繁体   English   中英

is_prime? 在Ruby中。 需要第二意见

[英]is_prime? in Ruby. Need a second opinion

我一直在研究红宝石,并且一直在做一些红宝石练习,以了解我知道多少(不是很多)。 这是我遇到的一个问题:

问:编写一个方法is_prime ?,该方法采用数字num,如果为质数则返回true,否则返回false。

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

该问题还附带一个答案。

A:

# 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

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

开始编写自动化测试。 特别...

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" ,则我的最后一个断言将破坏它。 (我在这里使用错误的库,但是您可以使用test/unit库随附的任何assert_true()断言。)

继续添加断言,并在断言时修复代码,直到您的代码看起来像该代码为止。 再看看一个标准的实施“的埃拉托色尼筛”,要了解为什么这些代码是无效的!

您的解决方案只检查数量是偶数还是没有,因为卡里Swoveland指出错误识别2为不是素数。 您还会错误地将9或15等数字标识为素数。

您可以通过以下几项操作来大大加快所提供的解决方案的速度:

  1. 在检查完num不能被2整除之后,您只需要检查超出该点的奇数即可。 将候选除数增加2而不是1。
  2. 在上限while循环,你需要检查最大的候选除数是Math.sqrt(num) 任何大于平方根的num因子都有一个小于平方根的辅因子,因此查看较大的候选对象没有意义。

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

例如,即使9不是素数,输入值9也会导致您的函数返回true。 它需要遍历所有可能的因素,而不仅仅是2,就像在样品溶液中一样。

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

另外,要使此方法适用于负数,请检查num <=1。如果是,则返回false。

优化1 :(轻松)不要一路攀升到数字。 仅上至数字的平方根。 为了轻松完成此操作,请设置循环条件(i * i <= num)

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

为了使这项工作有效,您需要在代码的开头再添加两项检查(请参阅:if语句)。 第一个检查是否(num == 2)。 如果是,则返回true。 第二个检查是否(num%2 == 0)。 如果是,则返回false;否则返回false。

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

掌握了审判师的知识后,您可能希望检查一下Eratosthenes筛。 这是很酷的豆子,并不是很难理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM