处理 Project Euler 问题的 Python 代码时出现内存错误

Memory Error in processing Python Code for Project Euler problem

尝试了运行一个代码来解决存档的欧拉项目问题

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

但我现在遇到了内存错误。难道我做错了什么? PL。解释。我的代码-

def euler_1(n):
    x=0
    abc=[]
    while x<n:
        if x%3==0 or x%5==0:
            abc.append(x)
            x+=1
        else:
            pass

    return sum(abc)

只需使用列表理解并跳过只会减慢速度的 while 循环和追加。

sum([x for x in range(1, 1000) if x%3==0 or x%5==0]) # -> 233168

您需要确保每次迭代循环时都递增计数器。否则你会卡在非倍数上并遇到无限循环。

考虑以下情况。当x=4:

if x%3==0 or x%5==0:
# evaluates to false

所以我们移动 else 语句并返回到循环的顶部。什么都没有改变,所以 x 仍然是 4,并且这个过程无限重复。如果您设置为使用 while 循环,则需要将 x+=1 移到 ifs 之外以在所有情况下发生:

def euler_1(n):
    x=0
    abc=[]
    while x<n:
        if x%3==0 or x%5==0:
            abc.append(x)
        x+=1
    return sum(abc)

但是,如果我可以提出一些建议:首先,您不需要从 0 开始计数器,而是从您想要找到倍数的最小整数开始。 0、1 和 2 没有意义的迭代,因为它们永远不会计数。

其次,我建议使用 for 循环或列表理解,因为无论结果如何,它们都会在每个循环中增加计数器。确保将范围的末尾设置为 n+1,因为 Python 范围是半开集,即不包括最后一个数字。

abc = sum([x for x in range(0, n+1) if x%3==0 or x%5==0)]

abc=0
for x in range(0, n+1):
    if x%3==0 or x%5==0:
        abc += x
return abc

else语句中,删掉pass语句,写成x+=1,因为更新x与条件无关。如果条件不满足时不更新 x,则条件将永远不满足,循环将继续