我正在努力优化这些函数,这些函数用于计算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的答案。
答案 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")