给定数量的所有因素

the*_*gah 28 ruby algorithm math

例如,我有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
Run Code Online (Sandbox Code Playgroud)

divisors_of(4800)=> [[1,4800],[2,2,400],[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]]

你会用红宝石或任何语言做到这一点?

Mar*_*une 46

在Ruby中,prime库为您提供分解:

require 'prime'
4800.prime_division #=> [[2, 6], [3, 1], [5, 2]]
Run Code Online (Sandbox Code Playgroud)

要获得你的名单,你可以获得可能的权力的笛卡尔积:

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]]
Run Code Online (Sandbox Code Playgroud)

注意:在Ruby 1.8.7中,您必须require 'mathn'代替require 'prime'.在Ruby 1.8.6中,require 'backports/1.8.7/enumerable/inject'或者修改inject上面的...

  • 有人能用数学方法解释*factors_of*吗? (4认同)

blu*_*mei 22

 def divisors_of(num)
   (1..num).select { |n|num % n == 0}
 end
Run Code Online (Sandbox Code Playgroud)


lip*_*ski 6

我认为这个解决方案更好,特别是因为它不执行如此多的循环,它不需要Prime库,最重要的是它运行直到Math.sqrt(n).这是代码:

class Integer
  def factors
    1.upto(Math.sqrt(self)).select {|i| (self % i).zero?}.inject([]) do |f, i| 
      f << i
      f << self / i unless i == self / i
      f
  end.sort
end

# Usage
4800.factors
Run Code Online (Sandbox Code Playgroud)

如果你想将它们配对,就像在你的例子中一样,你可以使用下面的一段代码(首先与最后一对配对,如果有奇数个因子,那么中间的一个是平方根):

class Integer
  def paired_up_factors
    a = self.factors
    l = a.length
    if l % 2 == 0
      a[0, l / 2].zip(a[- l / 2, l / 2].reverse)
    else
      a[0, l / 2].zip(a[- l / 2 + 1, l / 2].reverse) + [a[l / 2], a[l / 2]]
    end
  end
end

# Usage
4800.paired_up_factors
Run Code Online (Sandbox Code Playgroud)

  • 你有一个错误。`irb(main):026:0&gt; 64.paired_up_factors =&gt; [[1, 64], [2, 32], [4, 16], 8, 8]` 最后一组应该是 [8,8] (2认同)