您的问题是您在循环的每次迭代中都没有保留任何价值。您的循环将通过以下方式修复:
place = []
for x in range(1000):
if x % 3 == 0 or x % 5 == 0:
place.append(x)
sum(place)
或者只是一路计算:
result = 0
for x in range(1000):
if x % 3 == 0 or x % 5 == 0:
result += x
result
正如所指出的,一个简单的生成器表达式可以解决问题:
sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0)
注意:我使用 Py3 - 在 Py2 中 xrange() 将通过避免 list 构造 range() 来进行优化。
但是sum(range(n+1))有一个封闭的形式:
s(n) = n * (n + 1) // 2
例如:
sum([0, 1, 2, 3, ..., 999]) == 999 * 1000 // 2 == 499500
可以扩展为sum(range(0, n+1, c))为:
s(n, c) = c * (n//c) * (n//c + 1) // 2
例如:
sum([0, 3, 6, 9, ..., 999]) == 3 * (999//3) * (999//3 + 1) // 2 == 166833
所以你可以把问题改写为s(999, 3) + s(999, 5) - s(999, 15),你必须减去s(999, 15),或者你把所有可以被3和5整除的值加倍,例如:
In []:
n = 1000
s = lambda n, c: c * (n//c) * (n//c + 1) // 2
s(n-1, 3) + s(n-1, 5) - s(n-1, 15)
Out[]:
233168
这是O(1) 与O(n) 对所有各种sum 建议的方法。