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)
对于下面的问题: "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)