20

我知道,在 Ruby 中,您可以使用该Integer#lcm方法获得两个数字的最小公倍数。例如:

10.lcm(15)
# => 30

是否有一种有效的(或内置于核心或标准库)的方法来获得给定数组中所有整数的最小公倍数?例如:

[5, 3, 10, 2, 20].lcm
# => 60
4

3 回答 3

36

任何需要两个操作数的操作都可以通过折叠来迭代地应用于集合:Enumerable#inject/reduce。为了覆盖空的情况,将操作的标识元素作为第一个参数传递,这是1最小公分母。

[5, 3, 10, 2, 20].reduce(1) { |acc, n| acc.lcm(n) } # => 60

也可以写成:

[5, 3, 10, 2, 20].reduce(1, :lcm)
于 2012-05-28T11:03:27.040 回答
1

除了 tokland 的回答,如果你真的想要一个#lcm方法作用于一个整数数组,你可以在 Array 类中添加一个实例方法。

class Array
  def lcm
    self.reduce(1, :lcm)
  end
end

puts 10.lcm(15)
# => 30
puts [5,3,10,2,20].lcm
# => 60

(这种做法称为Monkey patching,因为您在运行时扩展一个类。但有些人确实不赞成这种做法。)

于 2020-12-13T21:10:04.127 回答
0
[5,3,10,2,20].reduce(&:lcm)
于 2021-11-16T19:42:23.333 回答