我正在努力优化我用来计算 10000 以下友好对的总和的这些函数。 amicable pair 是一对 (a, b),其中“a”的除数之和不包括“a”本身等于 b 和“b”的除数不包括“b”本身的总和等于“a”。

IE。 220 的因数是 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 和 110: 它们的和是 284. 和 284 (1, 2, 4, 71 and 142) 等于 220。

我的代码是:

import math
def Divisorsbaritself(x):
    divList = [1]
    y = 2
    while y <= math.sqrt(x):
        if x % y == 0:
            divList.append(y)
            divList.append(int(x / y))
        y += 1
    return sum(divList)

def amicable():
    solution = []
    for i in range(10000):
        if Divisorsbaritself(Divisorsbaritself(i)) == i:
            solution.append(i)
    return sum(solution)

print amicable()

我需要帮助来理解为什么友好功能不起作用。对我来说,if Divisorsbaritself(Divisorsbaritself(i)) == i: 条件是将 i 包含在列表中的正确条件是合乎逻辑的,但它给了我 40285,而不是 31626,答案。

最佳答案

如果 Divisorsbaritself(i)==i 你不应该算 i

def amicable():
    solution = []
    for i in range(10000):
        if Divisorsbaritself(i)!=i and Divisorsbaritself(Divisorsbaritself(i)) == i:
            solution.append(i)
    return sum(solution)

但是你也应该修复如果 i 是一个完美的正方形并且是一个友好的一对,这将是一个问题。

您可以通过列表推导来改进这一点。
def amicable():
    solution = [i for i in xrange(10000) if Divisorsbaritself(i)!=i and Divisorsbaritself(Divisorsbaritself(i)) == i]
    return sum(solution)

关于python - 友好的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27517330/

10-12 05:17