For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
Evaluate the sum of all the amicable numbers under 10000.
def d(n):
s = 1
for i in range(2, n//2 + 1):
if n % i == 0:
s += i
return s
def o(n):
s = 0
for i in range(2, n):
dn = d(i)
if d(dn) == i and i < dn:
s += i
s += dn
return s
计算因子和的算法太慢,参照Project Euler大牛给出的算法,可以提高很多速度。
def SumOfDivisors(n):
s = 1
p = 2
while p*p <=n and n > 1:
if n%p == 0:
j = p * p
n //= p
while n % p == 0:
j *= p
n //= p
s *= (j-1)
s //= (p-1)
if p == 2:
p = 3
else:
p += 2
if n > 1:
s *= (n + 1)
return s