对 Ruby 中的一系列数字使用模数

Using modulo on a range of numbers in Ruby

我正在 ruby 中编写一个程序来查找给定数字的所有质因数。我知道 ruby 有一个 .Prime class,但我想在不使用它的情况下完成此操作。

除一个问题外,一切正常:我找不到对一系列数字进行 运行 模运算的方法。我试图在网上、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>'

我用谷歌搜索了那个错误,但没有成功。如果我将代码更改为非范围,它会起作用。

你的逻辑不正确。您尝试更简单的方法,例如:

def prime(n)
  !(2..n-1).detect{|x| n%x == 0}
end

这里 detect 将 return 匹配条件 n%x == 0x 的第一个值。如果 none 匹配 nil 则 returned。因此在质数的情况下 (2..n-1).detect{|x| n%x == 0} 将 return nil! 将使其成为 true。对于合数,它们的最低除数将被 returned 和 ! 将使它成为 false.

你的代码有什么问题?

你正在做 x % (2..x-1)。这里 (2..x-1) 是一个范围。您不能用范围对 Fixnum 取模。因此你会得到:

TypeError: Range can't be coerced into Fixnum

您可以使用 (2..x-1).each{|n| x%n} 或任何其他枚举器代替 each 来改进 x % (2..x-1)。不过我还是觉得你的逻辑太复杂了,还是这么简单的问题。

any?怎么样?

def prime(n)
  range = Range.new(2, n-1)
  composite = range.any? { |i| n%i == 0 }

  !composite
end

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