PythonMath项目Euler P23

2024-07-03 06:01:45 发布

您现在位置:Python中文网/ 问答频道 /正文

def isAbundant(testNum):
    total = 1
    divisor = 2 
    while divisor < (testNum/2  + 1):
        if(testNum%divisor == 0):
            total = total + divisor
        divisor = divisor + 1   
    if total > testNum:
        result = True
    else:
        result = False
    return result

#create a list of abundant numbers
i = 12
listOfAbunNo = []
sums = []
while i < 28112:
    if isAbundant(i) == True:
        listOfAbunNo.append(i)
    i = i+1 
    print(i)
# create list of sums of Abundant numbers
i = 0
print(len(listOfAbunNo))
while i < len(listOfAbunNo):
    j = i                       # i and j are abundant numbers (indexes) to sum
    while j <len(listOfAbunNo):  
        sums.append(listOfAbunNo[i]+listOfAbunNo[j])
        j=j+1
    i = i+1
#remove duplicates 
sums.sort() 
i = 1
while i<len(sums):
    if (sums[i-1] == sums[i]):
        sums.remove(sums[i-1])
    else:
        i = i + 1
#calc total
print(str(sum[12,28111] - sum(sums)))

这是我的问题代码https://projecteuler.net/problem=23,对吗?如何优化它?你知道吗

问题 一个完全数是一个数,它的固有因子之和正好等于这个数。例如,28的真因子之和是1+2+4+7+14=28,这意味着28是一个完美的数字。你知道吗

如果一个数n的真因子之和小于n,则称为亏数;如果这个数n的真因子之和大于n,则称为丰数

因为12是最小的富足数,1+2+3+4+6=16,所以可以写成两个富足数之和的最小数是24。通过数学分析可以看出,所有大于28123的整数都可以写成两个富足数的和。然而,即使已知不能表示为两个充裕数之和的最大数小于这个极限,通过分析也不能进一步降低这个上限。你知道吗

求所有不能写成两个充裕数之和的正整数之和。你知道吗


Tags: oftruelenifresultdivisortotalsum
1条回答
网友
1楼 · 发布于 2024-07-03 06:01:45

is it correct?

是-除了最后一步,用print(str(sum[12,28111] - sum(sums)))计算总数不起作用:

  1. sums包含所有的复合数,也包括那些高于28112的数字。试试print(max(sums)),你就会得到56220。所以你不能把所有的数字加起来,很多数字不应该计入总数。你知道吗
  2. 您应该提供“所有正整数(…)”的和,因此应该从1开始,而不是从12开始。你知道吗
  3. sum[12, 28111]不是有效的Python语法,请尝试sum(range(12, 28111))

您可以按以下步骤执行最后一步:生成一个包含所有非复合数字的列表,即要添加的数字,然后对这些数字求和:

non_composites = sum([i for i in range(1, 28112) if i not in sums])
print(str(non_composites))

and how can I optimize it?

删除重复项:您可以优化“删除重复项”部分:

#remove duplicates 
sums.sort() 
i = 1
while i<len(sums):
    if (sums[i-1] == sums[i]):
        sums.remove(sums[i-1])
    else:
        i = i + 1

可以写得更像python(更快)作为

#remove duplicates 
sums = list(set(sums))

它将使sums成为^{},删除它的所有重复项,然后使它再次成为一个列表。你知道吗

禁用-函数:代替

if total > testNum:
    result = True
else:
    result = False
return result

你可以写

return total > testNum

总和列表:这部分也可以从

# create list of sums of Abundant numbers
i = 0
print(len(listOfAbunNo))
while i < len(listOfAbunNo):
    j = i
    while j <len(listOfAbunNo):  
        sums.append(listOfAbunNo[i]+listOfAbunNo[j])
        j=j+1
    i = i+1

for i in range(len(listOfAbunNo)):
    for j in range(i, len(listOfAbunNo)):
        sums.append(listOfAbunNo[i]+listOfAbunNo[j])

所以你的整个代码现在看起来是这样的:

import time

def isAbundant(testNum):
    total = 1
    divisor = 2 
    while divisor < (testNum/2  + 1):
        if(testNum%divisor == 0):
            total = total + divisor
        divisor = divisor + 1   
    return total > testNum

start = time.time()
#create a list of abundant numbers
listOfAbunNo = []
for i in range(12, 28124):
    if isAbundant(i):
        listOfAbunNo.append(i)

# create list of sums of abundant numbers
sums = []
for i in range(len(listOfAbunNo)):
    for j in range(i, len(listOfAbunNo)):
        sums.append(listOfAbunNo[i]+listOfAbunNo[j])

#remove duplicates 
sums = list(set(sums))

#calc total
non_composites = sum([i for i in range(1, 28124) if i not in sums])
print(str(non_composites))
print('finished in ' + str(time.time()-start) + 's')

我添加了一个计时函数,代码在我的机器上大约40秒后返回正确的结果。你知道吗

相关问题 更多 >