【问题标题】:Project euler #23 tricky conflictProject euler #23 棘手的冲突
【发布时间】: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 直接添加到最终输出(因为它们显然是总和的一部分),我将得到 41801474179871+sum(range(1, 24))。如果我像其他人一样检查这些数字,我会得到正确的答案4179871

据我所知,描述和我的代码之间存在冲突。如果4179871是正确答案,那么1-23是整数可以写成两个丰富数之和,但实际上他们不能根据描述(24是最小的)。

这个问题几乎把我逼疯了,有没有人可以帮忙??提前非常感谢!

【问题讨论】:

标签: python


【解决方案1】:

您的代码已将数字 1 到 23 添加到 total

如果您修改程序以打印出添加了哪些数字:

if canbe==False:
    print 'added ' + str(i)
    total+=i

程序将打印出来:

added 1
added 2
added 3
added 4
added 5
added 6
added 7
added 8
added 9
added 10
added 11
added 12
added 13
added 14
added 15
added 16
added 17
added 18
added 19
added 20
added 21
added 22
added 23
added 25
...

您会看到数字 1 到 23 已经添加到 total,因此您无需自己添加。

【讨论】:

  • 酷!非常感谢,我看到我的代码出了什么问题,很明显,我忘记了“if i>24:”条件。我不敢相信我已经花了几个小时:b
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多