我一直在处理素数程序,我遇到了一些Ruby代码:
(2..prime/2).none?{|i| prime % i == 0}
有人可以将这一点告诉我,并以简单的方式向我解释。如果你熟悉reddit EIL5。 (解释它就像我' 5。)
我在这里找到了代码:
How can I test if a value is a prime number in Ruby? Both the easy and the hard way?
答案 0 :(得分:6)
即使效率很低,也很直接。它分解为:
# For each of the numbers in the range 2 to prime/2...
(2..prime/2).none? do |i|
# ...test that none of them divide evenly with the given prime.
# That is the modulus (%) of those two numbers is zero, or no
# remainder from division.
prime % i == 0
end
解决这个问题有更好的方法,但这种蛮力方法应该有效。
none?
是Enumerable中提到的众多便捷方法之一。它们可以处理Array和Hash对象,并提供有用的工具,用于将一组对象转换为另一组对象。
在这种情况下,它测试的是没有数字符合这些标准。这与any?
或all?
相反,具体取决于您的要求。
答案 1 :(得分:2)
命名变量很难但非常重要。 正如其他人所提到的,你所展示的代码是测试一个数字是否为素数。
如果您使用prime
作为此号码的变量名称,那么检查它是否为素数应该没有任何用处!
所以
(2..prime/2).none?{|i| prime % i == 0}
应该是
(2..number/2).none?{|i| number % i == 0}
为了使它更加明显,这段代码可以用一种方法编写:
def is_prime?(number)
(2..number/2).none?{|i| number % i == 0}
end
此处?
表示该方法返回一个布尔值。
none?
:
none?
可以在任何Enumerable(Arrays,Hash和Array-like对象)上调用。nil
或false
以外的值,none?
会停止并返回false
true
。none?
相当于all?
,条件相反。示例:
puts [1, 3, 5, 7].none?{ |n| n.even? }
#=> true
puts [1, 3, 5, 7].all?{ |n| n.odd? }
#=> true
puts [1, 2, 3, 4, 5, 6, 7].none? { |n| n > 6 }
#=> false
如果number % 2 == 0
为false,则表示number
为奇数。检查number/2
是否划分number
是没有用的,我们知道它也是false
。
这意味着范围太大了!可能是(2..number/3)
但如果数字不能被3整除,那么检查number
是否可被number/3
整除也毫无意义。
它一直持续到范围尽可能小:
(2..Math.sqrt(number))
这将使大数字的执行速度更快。
def is_prime?(number)
(2..Math.sqrt(number)).none? { |i| number % i == 0 }
end
p (2..100).select { |n| is_prime?(n) }
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
要检查它是否正确,我们可以使用Prime库:
require 'prime'
p (2..100).select { |n| is_prime?(n) } == Prime.take_while{|p| p<100 }
#=> true
答案 2 :(得分:0)
昨天我们谈到了素数。你还记得他们是什么吗?不,露西,不是&#34;黄金时段&#34;数字,只是&#34;素数&#34;数字。但你是对的,素数是一个2或更多的自然数,并且可以被1整除,本身也没有其他数字。
假设您有一个号码并被要求确定它是否为素数,即它是否为素数。让我们说这个数字是35.如何回答这个问题呢?没错,你可以看看它是否可以被1和1以外的任何自然数整除。如果它可以被除1和35之外的数字整除,那么它就不是素数。如果它不是,它将是素数。好女孩!
好的,可以被2整除吗?是的,没错,35除以2是17.5,但这不是我的意思。我的意思是,它可以被2整除而没有余数吗?请记住,如果我们将35除以2,则余数表示为35%2,等于1.因此它不能被2整除.3怎么样?剩余部分,35%3,等于2,所以它不能被3整除。它也不会被4整除,因为35%4等于3.实际上,我们真的没有必要检查35是否是可以被4整除。你知道为什么吗?浓缩,露西。别忘了撒上冰淇淋。很好!如果它可被4整除,它也可以被2整除,因为2x2 = 4,但我们已经发现它不能被2整除。
35可被5整除吗?是!你已经知道了! 5次7确实是35,但我们也可以计算35%5 = 0,所以没有余数。这意味着35 不是素数。得到它?是啊!
露西,在你拿到冰淇淋之前还有一个问题。假设数字是13而不是35,我们发现13不能被数字2,3,4,5和6整除。你能从中得出什么结论吗?我们下次要试试7吗?露西,你今天多么光明。除了数字本身之外,该数字不能被任何大于该数字一半的数字整除。除以这些数字中的任何一个的数字将等于零,其余为正数。所以,我们只需要考虑这个数字是否可以被2到2.5之间的任何数字整除。好问题,露西!如果除以2的数字有余数,我们只是忽略余数。
好的,露西,你已经获得了冰淇淋,所以让我们把它拿出来。