【发布时间】:2014-10-14 04:37:11
【问题描述】:
欧拉计划问题 23 金额不高
完美数是一个数,它的真因数之和正好等于这个数。例如,28 的因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。
如果一个数 n 的真因数之和小于 n 则称为不足数,如果该数之和超过 n 则称为丰富数。
由于12是最小的丰富数,1 + 2 + 3 + 4 + 6 = 16,所以可以写成两个丰富数之和的最小数是24。通过数学分析,可以证明所有大于 28123 的整数可以写成两个丰富数之和。但是,即使已知不能表示为两个丰富数之和的最大数小于此上限,也无法通过分析进一步降低此上限。
找出所有不能写成两个丰富数之和的正整数之和。
这是我运行 25 秒来解决此问题的代码。
import time
def check_abundant(n):
s=0
for i in range(1,n/2+1):
if n%i==0:
s+=i
if n<s:
return True
else:
return False
start = time.time()
check=[None]*28123
check[12]=True
for i in range(1,12):
check[i]=False
total=0
can=0
for i in range(1,28123+1):
canbe=False
'''
if i<24:
total+=i
if i==24:
total+=0
'''
for j in range(1,i/2+1):
if check[j]==None:
check[j]=check_abundant(j)
if check[i-j]==None:
check[i-j]=check_abundant(i-j)
if check[j]==True and check[i-j]==True:
canbe=True
break
if canbe==False:
total+=i
elapsed = (time.time() - start)
print "%s found in %s seconds" % (total,elapsed)
但我这里有个棘手的问题,正如描述中所说,24是可以写成两个丰富数之和的最小数,对我来说这也意味着1-23 不能写成两个丰富数之和,因为它们小于 24 并且是正整数。
这就是问题所在。在我的代码中,如果我将 1-23 直接添加到最终输出(因为它们显然是总和的一部分),我将得到 4180147 即 4179871+sum(range(1, 24))。如果我像其他人一样检查这些数字,我会得到正确的答案4179871。
据我所知,描述和我的代码之间存在冲突。如果4179871是正确答案,那么1-23是整数可以写成两个丰富数之和,但实际上他们不能根据描述(24是最小的)。
这个问题几乎把我逼疯了,有没有人可以帮忙??提前非常感谢!
【问题讨论】:
-
这对于 Project Euler 论坛来说可能是一个更合适的问题。查看forum.projecteuler.net/…
标签: python