一尘不染

给定数字的所有因子

algorithm

例如,我有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]]

您将如何用红宝石或任何语言来做到这一点?


阅读 256

收藏
2020-07-28

共1个答案

一尘不染

在Ruby中,该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以上内容…

2020-07-28