您的位置:首页 > 其它

Project Euler – Problem 21

2012-05-05 08:32 302 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: