如果我有一个函数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或者是否有快捷方式?
答案 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