Python生成器和倍数之和

时间:2015-02-13 19:53:21

标签: python generator

对于以下问题: “返回数字下方3和5的倍数之和。”

我试图使用:

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

但是,如果数字太大,则会出现溢出。我不清楚我是如何尝试使用生成器表达式的(我是新手)。 我认为它一次评估范围中的每个x(没有构建列表)并且只评估总和的运行记录而不是在评估列表中的每个项目之前构建列表。 任何人都可以解释为什么这不起作用?感谢。

1 个答案:

答案 0 :(得分:0)

实际上,这不是一个问题。 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 - 位int,没问题。

有可能在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)