繁体   English   中英

友善号码

[英]Amicable Numbers

我正在努力优化这些函数,这些函数用于计算10000以下的友好对的总和。 友好对是一对(a,b),其中“a”除数的总和除以“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: condition是将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)

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

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

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

只有当它们不同时,它们才是友好的数字 因此,如果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的正确结果。

我现在修复了这个bug:

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)

我写了你所说的全部内容

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM