我正在查看Project Euler上的问题来自学Ruby编程。 我知道有一个内置函数来执行此操作,但我避免使用内置函数来帮助我学习。
所以我必须编写一个方法来确定一个数字是否是素数。第一种方法有效,但第二种方法没有。任何人都可以解释原因吗?
def is_prime n
for d in 2..(n - 1)
if (n % d) == 0
return false
end
end
true
end
def is_prime2 n
foundDivider = false
for d in 2..(n - 1)
foundDivider = ((n % d) == 0) or foundDivider
end
not foundDivider
end
答案 0 :(得分:17)
这是因为=
的优先级高于or
。请参阅下面的Ruby's operator precedence table(从最高到最低的优先级):
[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
defined?
not
or and
if unless while until
begin/end
有问题的行被解析为......
(foundDivider = ((n % d) == 0)) or foundDivider
......这当然不是你的意思。有两种可能的解决方案:
强制优先权成为你真正的意思......
foundDivider = (((n % d) == 0) or foundDivider)
...或者使用||
运算符,其优先级高于=
:
foundDivider = ((n % d) == 0) || foundDivider
答案 1 :(得分:9)
Ruby带有预定义的类,如Prime。您所要做的就是将该课程纳入您的项目。
require 'prime'
然后,你可以使用一些Prime方法,比如 first 来获得第一个x prime元素:
Prime.first(5) # Ret => [2, 3, 5, 6, 11]
或者你可以这样做:
Prime.each(100) do |prime|
p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end
我希望你觉得这很有用。
答案 2 :(得分:5)
def prime(n)
(2..n/2).none?{|i| n % i == 0}
end
素数是除了自身和1之外没有正除数的任何数字。
答案 3 :(得分:4)
从循环中查找素数:
def get_prime_no_upto(number)
start = 2
primes = (start..number).to_a
(start..number).each do |no|
(start..no).each do |num|
if ( no % num == 0) && num != no
primes.delete(no)
break
end
end
end
primes
end
并使用如下:
puts get_prime_no_upto(100)
干杯!
答案 4 :(得分:3)
这是代码,它会提示您输入一个用于检查的数字:
puts "welcome to prime number check"
puts "enter number for check: "
n = gets
n = n.to_i
def prime(n)
puts "That's not an integer." unless n.is_a? Integer
is_prime = true
for i in 2..n-1
if n % i == 0
is_prime = false
end
end
if is_prime
puts "#{n} is prime!"
else
puts "#{n} is not prime."
end
end
prime(n)
答案 5 :(得分:3)
def prime? n
(2..Math.sqrt(n)).none? {|f| n % f == 0}
end
因子范围应从2开始并以n的平方根结束,因为每个数字都可以被1整除,并且没有数字可以被大于其平方根的两个数字整除。
说明:非素数是两个数的乘积。
n = f1 * f2
n
始终可以被平方根整除,因此f1
和f2
都不能大于n的平方根,否则f1 * f2
将大于{{} 1}}。因此,至少一个因子小于或等于n
。在查找素数的情况下,只需找到一个因子,因此我们应该从Math.sqrt(n)
循环到2
的平方根。
答案 6 :(得分:1)
FYI - re:上面的DarkMouses主要方法 - 我发现它真的有用,但有一些错误(我认为!)需要解释:
它应该是括号而不是方括号......否则你会得到一个TypeError
Range can't be coerced into Fixnum (TypeError)
其次,'false'之前的第一个冒号也会导致错误。据我所知,这是不正确的语法。摆脱它。
最后,我认为你错了方法吗?如果你纠正了我提到的错误,如果它不是素数则返回true,如果是IS则返回false。
你可以完全放弃三元运算符,只需这样做:
def prime?(n)
(2..n/2).none?{|i| n % i == 0}
end
显然它没有覆盖边缘情况(0,1,2),但是我们不会分裂头发。
...对于那些喜欢发型的人来说,这是我对这个问题的完整解决方案:
def prime?(n)
return false if n < 2
(2..Math.sqrt(n)).none? {|num| length % num == 0}
end
希望我没有错过任何东西:)
答案 7 :(得分:0)
根据细节,这有点偏离主题,但对标题是正确的:在ruby中使用bash集成你可以做到:
def is_prime n
`factor #{n}`.split.count < 3
end
bash factor
函数返回一个数字加上他的所有因子,所以如果数字为素数,则会有两个单词计数。
这仅适用于代码高尔夫。
答案 8 :(得分:0)
我试过这个并且有效:
def prime?(n)
return false if n < 2
return true if n == 3 || n == 2
if (2...n-1).any?{|i| n % i == 0}
false
else
true
end
end
答案 9 :(得分:0)
def prime?(n)
if n <= 1
return false
else (2..n-1).to_a.all? do |integer|
n % integer != 0
end
end
end
从我的黄金时代开始?实验室。从消除所有小于或等于1的整数开始。
答案 10 :(得分:0)
def prime(n)
pn = [2]
if n < 2
return false
else
(2..n).each do |i|
not_prime = false
(2..Math.sqrt(i).ceil).each do |j|
not_prime = true if i % j == 0
end
pn.push(i) unless not_prime
end
end
return pn
end
p素数(30)给出
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
答案 11 :(得分:0)
如果数字是素数,它将返回真。
def prime_number(number)
(2..(number-1)).each do |value|
if (number % value) == 0
return false
end
return true
end
end
puts prime_number(4)
答案 12 :(得分:-2)
**简单的方法** 首次安装优质宝石
require 'prime'
`p prime.first(20)`
现在将文件另存为您想要的名称,这将自动生成前20个素数! :-)