我知道,在 Ruby 中,您可以使用该Integer#lcm
方法获得两个数字的最小公倍数。例如:
10.lcm(15)
# => 30
是否有一种有效的(或内置于核心或标准库)的方法来获得给定数组中所有整数的最小公倍数?例如:
[5, 3, 10, 2, 20].lcm
# => 60
我知道,在 Ruby 中,您可以使用该Integer#lcm
方法获得两个数字的最小公倍数。例如:
10.lcm(15)
# => 30
是否有一种有效的(或内置于核心或标准库)的方法来获得给定数组中所有整数的最小公倍数?例如:
[5, 3, 10, 2, 20].lcm
# => 60
任何需要两个操作数的操作都可以通过折叠来迭代地应用于集合: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)
除了 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,因为您在运行时扩展一个类。但有些人确实不赞成这种做法。)
[5,3,10,2,20].reduce(&:lcm)