在Ruby中对一系列数字使用modulo

时间:2015-02-21 06:17:08

标签: ruby modulo

我正在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搜索了这个错误,但没有运气。如果我将代码更改为非范围,则可以正常工作。

2 个答案:

答案 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

对于大数字来说,这当然会很慢。