在ruby中检查素数
我正在尝试编写一个方法,它接受一个数字并检查它是否是素数。在做了一些研究之后,一种快速的检查方法是将数字除以2和sqrt(我们正在检查的数字)之间的每个数字。如果是素数,我希望我的方法返回true,如果不是,则返回false 所以我试着编写对我来说合乎逻辑的代码,但我得到了一个错误。以下是我写的:在ruby中检查素数,ruby,square-root,Ruby,Square Root,我正在尝试编写一个方法,它接受一个数字并检查它是否是素数。在做了一些研究之后,一种快速的检查方法是将数字除以2和sqrt(我们正在检查的数字)之间的每个数字。如果是素数,我希望我的方法返回true,如果不是,则返回false 所以我试着编写对我来说合乎逻辑的代码,但我得到了一个错误。以下是我写的: def PrimeTime(num) counter = 2 while counter <= Math.sqrt(num).ceil (counter == M
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
重写代码
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
仅供参考,这不是家庭作业。我正在经历红细胞的问题。感谢您的帮助 您面临的最直接的问题是,这不是有效的Ruby:
(counter==Math.sqrt(num.ceil)?“假”
?
作为运算符,是三元运算符的一部分代码>,并始终与:
成对出现,当您在下一行中写入时。此外,过度使用三元运算符也是不好的。控制流也有问题:在计算“true”
之后,循环将继续,计数器不会改变,并且您得到了一个无限循环
我建议你算出算法应该是什么。如有必要,用英语写。然后确保正确地将其转换为Ruby
此外,Ruby方法应该使用snake大小写(小写,单词之间带下划线),因此PrimeTime
不是一个好名字。如果要返回布尔值(true
或false
),我建议使用prime?
(标识符中也允许使用问号)。如果您正在返回一个字符串(正如您似乎正在尝试的那样),请尝试检查\u的素性或类似的操作(不带问号)
还有。。。如果余数为零,则该数字不是素数。我想你的测试已经改变了
如果您仍然感到困惑:
def prime?(num);(2..Math.sqrt(num))。每个do |计数器|;如果(num%计数器==0);返回假结束;是的;结束
编辑重写的代码:中断并返回false
不会执行您想要的操作。它们都是控制语句;如果您中断
,返回
将不会发生。即使是这样,如果没有中断,写和
,或者至少写&&
,而不是&
(二进制和)
您的逻辑仍然是错误的:PrimeTime(16)
是true
,例如,它并不是我所期望的素性测试函数。您面临的最直接的问题是,这不是有效的Ruby:(counter==Math.sqrt(num.ceil))?“假”
?
作为运算符,是三元运算符的一部分代码>,并始终与:
成对出现,当您在下一行中写入时。此外,过度使用三元运算符也是不好的。控制流也有问题:在计算“true”
之后,循环将继续,计数器不会改变,并且您得到了一个无限循环
我建议你算出算法应该是什么。如有必要,用英语写。然后确保正确地将其转换为Ruby
此外,Ruby方法应该使用snake大小写(小写,单词之间带下划线),因此PrimeTime
不是一个好名字。如果要返回布尔值(true
或false
),我建议使用prime?
(标识符中也允许使用问号)。如果您正在返回一个字符串(正如您似乎正在尝试的那样),请尝试检查\u的素性或类似的操作(不带问号)
还有。。。如果余数为零,则该数字不是素数。我想你的测试已经改变了
如果您仍然感到困惑:
def prime?(num);(2..Math.sqrt(num))。每个do |计数器|;如果(num%计数器==0);返回假结束;是的;结束
编辑重写的代码:中断并返回false
不会执行您想要的操作。它们都是控制语句;如果您中断
,返回
将不会发生。即使是这样,如果没有中断,写和
,或者至少写&&
,而不是&
(二进制和)
但是,您的逻辑仍然是错误的:PrimeTime(16)
是真的
,例如,这并不是我期望从素性测试函数中得到的结果。在我看来,您使这种方法比它应该的更复杂。下面是我建议使用的代码
require 'prime'
puts 2.prime?
就这么简单。如果你想用自己的方法
require 'prime'
def prime?(num)
num.prime?
end
在我看来,你让这条路变得比它应该的更复杂。下面是我建议使用的代码
require 'prime'
puts 2.prime?
就这么简单。如果你想用自己的方法
require 'prime'
def prime?(num)
num.prime?
end
Ruby附带了预定义的类,如Prime
。你所要做的就是把这个类要求到你的项目中去
require 'prime'
然后,您可以使用一些素数方法
,例如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
我希望这对你有帮助。。通过miksiiRuby附带了预定义的类,如Prime
。你所要做的就是把这个类要求到你的项目中去
require 'prime'
然后,您可以使用一些素数方法
,例如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
我希望这对你有帮助。。通过Miksii您可以不使用Math.sqrt通过以下方式完成:
def is_prime?(number)
(2..number-1).each {|n| return false if number <= 1 || number % n == 0}
return true
end
def是素数?(数字)
(2..number-1)。如果number则每个{n |返回false,您可以不使用Math.sqrt按以下方式执行:
def is_prime?(number)
(2..number-1).each {|n| return false if number <= 1 || number % n == 0}
return true
end
def是素数?(数字)
(2..number-1).每个{n |返回false if number.“我建议你算出算法应该是什么。如果必要的话,用英语写出来。然后确保你正确地将它转换为Ruby”--例如,读@J-Dizzle:我认为对于一个与sy斗争的人来说,这个级别有点太高了