Python 生成器和倍数之和

Python generators and sum of multiples

对于下面的问题: "Return the sum of the multiples of 3 and 5 below a number."

我尝试使用:

def solution(number):
  return sum(x for x in range(1,number) if x%3==0 or x%5==0)

但是,如果数字太大,这会导致溢出。我不清楚我是如何尝试使用生成器表达式的(我是新手)。 我认为它是一次评估范围内的每个 x(不构建列表)并且只保留 运行 总和的计数而不是在评估列表中的每个项目之前构建列表。 谁能解释为什么这不起作用?谢谢

实际上,这不是真正的问题。 python3 linux shell:

的示例
>>> def solution(number):
...   return sum(x for x in range(10**15,number) if x%3==0 or x%5==0)
... 
>>> solution(10**15+20)
9000000000000082
>>> solution(10**15+17)
8000000000000065

(使用 20**15 作为偏移量以加快速度)似乎不会导致 32 位整数溢出。

由于所有 32 位整数的总和可以用 64 位整数表示,并且您想将多个整数相加到 32 位整数,这个没问题。

有可能在 python2 中运行内存溢出只是因为列表是在求和实际发生之前生成的。并且无法在合理的内存中表示数十亿个数字。

但是处理这个问题的方式根本不是解决这个问题的方法。总和等于:

n//15-1
---
\                               15 (m+1) (7*m+8)
/     7*15*i+3+5+6+9+10+12+15 = ---------------- where m=n//15-1
---                                     2
i=0

你还需要考虑最后的数字。

所以计算这个的方法是:

def sol15floor(n) :
    m = (n-1)//15-1
    s0 = 15*(m+1)*(7*m+8)//2
    return s0 + sum(x for x in range(15*m+16,n) if x%3==0 or x%5==0)