【发布时间】:2017-08-11 15:31:03
【问题描述】:
我一直在处理Project Euler #23。
这是任务:
问题 23
一个完全数是一个数,它的真因数之和正好等于这个数。例如,28 的因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。
如果一个数 n 的真因数之和小于 n 则称为不足数,如果该数之和超过 n 则称为丰富数。
由于12是最小的丰富数,1 + 2 + 3 + 4 + 6 = 16,所以可以写成两个丰富数之和的最小数是24。通过数学分析,可以证明所有大于 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 秒,任何优化都会很有用。
【问题讨论】:
-
这是为了参加 Hackerrank 比赛吗?
-
@AnthonyCollins Project Euler 是一个有数学/拼图问题的网站。
-
不,体育是为了娱乐和打发时间
-
您应该能够在此处包含一些动态编程方法(或缓存递归)。例如。如果 28 的除数已知,您可以将这些知识用于 56、84 等。这样可以节省很多。
-
哦,好的。我的 b。当前有一个名为“ProjectEuler+”的人力资源竞赛,当我读到这篇文章时,我想到了它,但我不确定这是否相关。继续哈哈