例えば 48 は、2 * 24, 3 * 16, 4 * 12, 6 * 8 に分けられますね。これを Ruby の Integer#divide2 メソッドとして実装しました。ペアを配列に格納して返します(そのようなペアがなければ、空の配列を返します)。引数に true を取れば、自明な 1 * 48 のようなペアも含みます。
class Integer def divide2(include1=false) ar = [] s = include1 ? 1 : 2 for i in s..(self ** 0.5) ar.push([i, self / i]) if (self % i).zero? end ar end end p 48.divide2 #=>[[2, 24], [3, 16], [4, 12], [6, 8]] p 15.divide2(true) #=>[[1, 15], [3, 5]]
これを使って、与えられた自然数のすべての約数が求められます。Integer#divisors_int メソッドです。
class Integer def divisors_int divide2(true).flatten.uniq.sort end end p 150.divisors_int #=>[1, 2, 3, 5, 6, 10, 15, 25, 30, 50, 75, 150] p 87656797765.divisors_int #=>[1, 5, 63533, 275941, 317665, 1379705, 17531359553, 87656797765]