例如,我有4800,我想查看此数字的所有因素。
# num = the number you want factors of def factors_of(num) (1..num).collect { |n| [n, num/n] if ((num/n) * n) == num}.compact end
divisors_of(4800)=> [[1,4800],[2,2400],[3,1600],[4,1200],[5,960],[6,800],[8,600],[ 10、480],[12、400],[15、320],[16、300],[20、240],[24、200],[25、192],[30、160],[32, 150],[40、120],[48、100],[50、96],[60、80],[64、75],[75、64],[80、60],[96、50] ,[100、48],[120、40],[150、32],[160、30],[192、25],[200、24],[240、20],[300、16],[ 320、15],[400、12],[480、10],[600、8],[800、6],[960、5],[1200、4],[1600、3],[2400, 2],[4800、1]] 您将如何用红宝石或任何语言来做到这一点?
divisors_of(4800)=> [[1,4800],[2,2400],[3,1600],[4,1200],[5,960],[6,800],[8,600],[ 10、480],[12、400],[15、320],[16、300],[20、240],[24、200],[25、192],[30、160],[32, 150],[40、120],[48、100],[50、96],[60、80],[64、75],[75、64],[80、60],[96、50] ,[100、48],[120、40],[150、32],[160、30],[192、25],[200、24],[240、20],[300、16],[ 320、15],[400、12],[480、10],[600、8],[800、6],[960、5],[1200、4],[1600、3],[2400, 2],[4800、1]]
您将如何用红宝石或任何语言来做到这一点?
在Ruby中,该prime库为您提供因式分解:
prime
require 'prime' 4800.prime_division #=> [[2, 6], [3, 1], [5, 2]]
为了得到您的清单,您采用了可能功效的笛卡尔积:
require 'prime' def factors_of(number) primes, powers = number.prime_division.transpose exponents = powers.map{|i| (0..i).to_a} divisors = exponents.shift.product(*exponents).map do |powers| primes.zip(powers).map{|prime, power| prime ** power}.inject(:*) end divisors.sort.map{|div| [div, number / div]} end p factors_of(4800) # => [[1, 4800], [2, 2400], ..., [4800, 1]]
注意 :在Ruby 1.8.7中,您必须require 'mathn'代替require 'prime'。在Ruby 1.8.6中,require 'backports/1.8.7/enumerable/inject'或修改inject以上内容…
require 'mathn'
require 'prime'
require 'backports/1.8.7/enumerable/inject'
inject