我正在ruby中创建一个程序来查找给定数字的所有主要因素。我知道ruby有一个.Prime类,但是我想在不使用它的情况下完成它。
除了一个问题之外,一切都运行良好:我找不到在一系列数字上运行模数的方法。我试图在线查找答案,在Ruby文档中,以及这里的旧帖子。到目前为止,我发现没有任何帮助。
以下是代码:
def prime(n)
r = Range.new(2, n-1)
r.each { |x| puts x if n % x == 0 && x % (2..x-1) != 0}
end
print "Please enter a number: "
prime(gets.chomp.to_i)
编辑:对不起,我可能一直模糊不清。这段代码:
x % (2..x-1) != 0
踢回来:
euler2.rb:3:in `%': Enumerator can't be coerced into Fixnum (TypeError)
from euler2.rb:3:in `block in divisible'
from euler2.rb:3:in `each'
from euler2.rb:3:in `divisible'
from euler2.rb:7:in `<main>'
我用Google搜索了这个错误,但没有运气。如果我将代码更改为非范围,则可以正常工作。
答案 0 :(得分:2)
你的逻辑错误。你可以尝试更简单的东西:
def prime(n)
!(2..n-1).detect{|x| n%x == 0}
end
此处detect将返回与条件x
匹配的n%x == 0
的第一个值。如果没有匹配nil
则返回。因此,如果素数(2..n-1).detect{|x| n%x == 0}
将返回nil
而!
将返回true
。对于复合数字,将返回最低除数,!
将使其为false
。
您的代码有什么问题?
你正在做x % (2..x-1)
。这里(2..x-1)
是一个范围。你不能用一个范围模数Fixnum。因此,你会得到:
TypeError: Range can't be coerced into Fixnum
您可以使用x % (2..x-1)
或任何其他枚举器代替(2..x-1).each{|n| x%n}
来改进each
。但是我仍然认为你的逻辑过于复杂或者像这样的简单问题。
答案 1 :(得分:0)
any?
怎么样?
def prime(n)
range = Range.new(2, n-1)
composite = range.any? { |i| n%i == 0 }
!composite
end
对于大数字来说,这当然会很慢。