项目euler#23棘手的冲突

时间:2014-08-20 17:43:18

标签: python

项目欧拉问题23 非丰富的总和

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。

如果n的适当除数之和小于n,则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 +总和(范围(1, 24))即可。如果我像其他人一样检查这些数字,我会得到正确答案 4179871

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

这个问题几乎让我疯狂,有人能帮忙吗?非常感谢提前!

1 个答案:

答案 0 :(得分: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,因此您无需自行添加。