我一直在处理“欧拉计划#23”。
这是任务:
问题23 完全数是其真因数之和正好等于该数的数字。例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完全数。 如果数字n的真因数之和小于n,则称数字n为不足数,如果此总和超过n,则称其为丰富数。 由于12是最小的丰富数,因此可以写成两个丰富数之和的最小数字为24(1 + 2 + 3 + 4 + 6 = 16)。通过数学分析,可以证明大于28123的所有整数都可以写成两个丰富数的和。但是,即使已知不能将不能表示为两个丰富数之和的最大数字小于此限制,但此上限也无法通过分析进一步降低。 找到所有不能写成两个丰富数之和的正整数的总和。
这是我的代码:
这是任务:
问题23 完全数是其真因数之和正好等于该数的数字。例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完全数。 如果数字n的真因数之和小于n,则称数字n为不足数,如果此总和超过n,则称其为丰富数。 由于12是最小的丰富数,因此可以写成两个丰富数之和的最小数字为24(1 + 2 + 3 + 4 + 6 = 16)。通过数学分析,可以证明大于28123的所有整数都可以写成两个丰富数的和。但是,即使已知不能将不能表示为两个丰富数之和的最大数字小于此限制,但此上限也无法通过分析进一步降低。 找到所有不能写成两个丰富数之和的正整数的总和。
这是我的代码:
import math
def getDivisors(num):
n = math.ceil(math.sqrt(num))
total = 1
divisor = 2
while (divisor < n):
if (num%divisor == 0):
total += divisor
total += num//divisor
divisor+=1
return total
def isAbundant(num):
if (getDivisors(num) > num):
return True
else:
return False
abundentNums = []
for x in range (0,28124):
if (isAbundant(x)):
abundentNums.append(x)
del abundentNums[0]
sums = [0]*28124
for x in range (0, len(abundentNums)):
for y in range (x, len(abundentNums)):
sumOf2AbundantNums = abundentNums[x]+abundentNums[y]
if (sumOf2AbundantNums<= 28123):
if (sums[sumOf2AbundantNums] == 0):
sums[sumOf2AbundantNums] = sumOf2AbundantNums
total = 0
for x in range (1,len(sums)):
if (sums[x] == 0):
total +=x
print('\n', total)
我得到的总值是4190404
。正确答案是4179871
。我花了一个小时查看我的代码,但我无法找到错误。我应该改变什么来纠正这个错误?我的答案很接近。提前致谢。
PS. 我是Python的新手。运行时间为25秒,任何优化都将非常有用。