查找给定数字因子的最快方法

时间:2013-12-04 16:05:08

标签: ruby performance loops

如果我有一个函数factors_of(number),我正在寻找找到该数字的所有因素的最快方法。

到目前为止我尝试过的最快的是

def factors_of(number)
  factors = 0
  n = 1
  while n <= number
    if number % n == 0
      factors += 1
    end
    n += 1
  end
  factors
end

但随着数字变大,它会变得缓慢。我是否需要每次从n..number迭代n或者是否有快捷方式?

2 个答案:

答案 0 :(得分:4)

如果您正在寻找所有除数(如原始代码所示),您只需要搜索数字的平方根,即

def divisors_of(number)
  divisors = []
  n = 1
  while n <= number ** 0.5
    if number.modulo(n) == 0
      divisors << n
      divisors << number / n unless number / n == n
    end
    n += 1
  end
  divisors.sort
end

通过首先找到所有素数因子,可能有一种更有效的方法,但这种算法很容易理解,它至少将复杂度降低到O(sqrt(n))而不是O( n)中。

答案 1 :(得分:3)

我不太清楚你是在寻找因素(如问题标题和问题文本所说)还是不同因素的数量(这是你的代码似乎计算的因素)。根据你的意思完全,其中一个可能会给你你想要的答案:

require 'prime'

# prime factors
def factors_of(number)
  number.prime_division.map(&:first)
end

factors_of(12)
# => [2, 3]

# number of prime factors
def factors_of(number)
  number.prime_division.map(&:last).inject(:+)
end

factors_of(12)
# => 3

# number of distinct prime factors
def factors_of(number)
  number.prime_division.size
end

factors_of(12)
# => 2