我正在尝试编写一个接受数字并检查其是否为素数的方法。在做了一些研究后,快速检查的方法是将数字除以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问题。任何帮助表示赞赏!
答案 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