友善号码

时间:2014-12-17 02:15:26

标签: python python-2.7

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

即。 220的除数是1,2,4,5,10,11,20,22,44,55和110:其总和是284.除数的总和为284(1,2,4,71和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的答案。

4 个答案:

答案 0 :(得分:2)

如果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)

但是如果我是一个完美的方形和友好的一对,你也应该修复那个问题。

您可以使用列表推导来改善这一点。

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

答案 1 :(得分:1)

只有当他们的不同时,他们才能保持友好的数字。因此如果divsum(i)等于i,那么就不包含这些数字尽管这意味着divsum(divsum(i))也等于i

此外,您当前的检查会计算完美正方形的平方根,即使它只有一个因子。

而且,最重要的是,我不会使用一个列表,然后在你可以简单地使用累加器的时候对它进行求和。并且 通常执行乘法比平方根更快,因此您可以更改while循环以将其考虑在内。

最后,为了对你所信仰的神灵的热爱,评论你的代码!它会让它所以更容易理解什么是继续前进,无论是对于他人还是对你自己都有六个月的时间。

合并这些更改会为您提供以下DivisorsBarItself功能:

def DivisorsBarItself(num):
    # Maintain sum of factors.

    divSum = 1

    # Go through every integer up to but excluding sqrt(num).

    testnum = 2
    while testnum * testnum < num:
        # If factor, add it and the complement (guaranteed integer).

        if num % testnum == 0:
            divSum += testnum + num/testnum
        testnum += 1

    # If perfect square, add the square root once.

    if testnum * testnum == num:
        divSum += testnum

    # Return the sum.

    return divSum

修复用于检测友好数字的逻辑并使用总和而不是列表为您提供:

def AmicableSum():
    # Set sum to zero and process all numbers below 10,000.

    solution = 0
    for num in range(10000):
        # Get the "friend", add only if different and f(f(x)) = x.

        numFriend = DivisorsBarItself(num)
        if numFriend != num and DivisorsBarItself(numFriend) == num:
            solution += num

    return solution

print AmicableSum()

,它给出31626的正确结果。

答案 2 :(得分:0)

我现在通过以下方式解决了这个问题:

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

答案 3 :(得分:0)

我已写完你所说的全部内容

def devisor(a):
   listOfFactors=[]
   for possibleFactor in range(1,a):
       if a%x==0:
           listOfFactors.append(possibleFactor)
   sumOfFactors=0
   for item in z:
       sumOfFactors+=item
   factorsOfNewSumAddedUp=0
   for x in range(1,sumOfFactors):
       if temp%x==0:
           factorsOfNewSumAddedUp+=x
   if a==factorsOfNewSumAddedUp:
        print("this is a divisor")