检查红宝石中的素数

时间:2014-09-11 03:58:31

标签: ruby square-root

我正在尝试编写一个接受数字并检查其是否为素数的方法。在做了一些研究后,快速检查的方法是将数字除以2和sqrt之间的每个数字(我们正在检查的数字)。我希望我的方法如果是素数则返回true,如果不是,则返回false。

所以我尝试编写对我来说合乎逻辑的代码,但是我收到了一个错误。这是我写的:

def PrimeTime(num)
    counter = 2
    while counter <= Math.sqrt(num).ceil
        (counter == Math.sqrt(num).ceil) ? "false"
        (num % counter == 0) ? "true" : counter += 1
    end
end

这给了我

(eval):429: (eval):429: compile error (SyntaxError)
(eval):422: syntax error, unexpected '\n'

重写代码

def prime?(num)
    (2..Math.sqrt(num).ceil).to_a.each do |number|
        if num % number == 0
            return false
        else
            return true
        end
    end
end 

仅供参考,这不是作业。我正在经历coderbyte问题。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

您面临的最近问题是,这不是有效的Ruby:(counter == Math.sqrt(num).ceil) ? "false"

?,作为运算符,是三元运算符... ? ... : ...的一部分,并且在您下一行写入时始终与:成对。然后,过度使用三元运算符也不好。您还遇到控制流问题:在评估"true"后,循环将继续,counter不会发生变化,并且您将获得无限循环。

我建议你找出算法应该是什么。如有必要,请用英文书写。然后确保正确地将它转换为Ruby。

此外,Ruby方法应该是蛇形式(小写,单词之间有下划线),因此PrimeTime不是一个好名字。如果您要返回布尔值(prime?true),我建议false(标识符中也允许使用问号)。如果您要返回一个字符串(您似乎正在尝试这样做),请尝试check_for_primality或类似的东西(不带问号)。

另外......如果余数为零,则该数字 prime。我想你的测试已经改变了。

如果你仍然难过:

  

def prime?(num); (2..Math.sqrt(num))。每个do | counter |; if(num%counter == 0);返回假端;真正;端

编辑关于重写的代码:break & return false没有做你想要的。它们都是控制声明;如果您break,则return不会发生。即使它确实如此,如果没有中断,最好还是写and,或者至少&&,而不是&(二进制和)。

你的逻辑仍然是错误的:PrimeTime(16)true,例如,并不是我对素性测试函数的期望。

答案 1 :(得分:1)

在我看来,你的制作方式比它应该更复杂。这是我建议使用的代码。

require 'prime'

puts 2.prime?

就这么简单。如果你想制作自己的方法

require 'prime'

def prime?(num)
    num.prime?
end

答案 2 :(得分:0)

Ruby带有预定义的类,例如Prime。您所要做的就是将该课程纳入您的项目。

require 'prime'

然后,您可以使用某些Prime methods,例如 first 来获取第一个x素数元素:

Prime.first(5) # Ret => [2, 3, 5, 6, 11]

或者你可以这样做:

Prime.each(100) do |prime|
  p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end

我希望这对你有帮助..来自miksiii