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

时间:2013-11-03 23:09:04

标签: ruby-on-rails ruby primes

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

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

您可能希望使用模运算:5%2在将5除以2时返回余数:1。如果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

由于我所拥有的与答案完全不同,我可以使用支持我的人来查看我是否在正确的轨道上。谢谢。

4 个答案:

答案 0 :(得分: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个断言。)

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

答案 1 :(得分:2)

您的解决方案仅检查数字是否均匀,并且Cary Swoveland指出将错误地将2识别为非素数。您还会错误地将诸如9或15之类的数字标识为素数。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

要通过似乎是你正在尝试做的试验分区来做到这一点,最简单的方法是从i = 2开始并且做i%num == 0.然后我继续将i递增1小于数字

另外,为了使这个工作为负数,请检查num&lt; = 1.如果是,则返回false。

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

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

要使其工作,您需要在代码的开头添加两个以上的检查(读取:if语句)。第一个检查是否(num == 2)。如果是,返回true。第二个检查是否(num%2 == 0)。如果是,则返回false;

优化3 :(困难) 你只需要检查素数。如果生成并存储素数列表,则可以使用这些素数快速查找比列表中最高素数更大的素数。一旦你理解了优化2,你就可以很容易地写出来。

一旦你掌握了试验师,你可能想看看Eratosthenes的Sieve。这是很酷的豆子,并不难理解。