[英]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.