20

Rubyでは、このInteger#lcmメソッドを使用して、2つの数値の最小公倍数を取得できることを知っています。例えば:

10.lcm(15)
# => 30

特定の配列内のすべての整数の最小公倍数を取得するための効率的な(またはコアまたはstdlibに組み込まれている)方法はありますか?例えば:

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

3 に答える 3

36

2つのオペランドをとる操作は、コレクションを折りたたむことで繰り返し適用できます: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

(この方法は、実行時にクラスを拡張するため、モンキーパッチと呼ばれます。ただし、この方法に眉をひそめる人もいます。)

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