如何在Python中找到小于1000的所有3或5的倍数之和?
我不太确定我是不是应该把这个问题发到数学论坛上,但因为它涉及到更多的编程内容,所以我选择在这里发。
这个问题看起来很简单,但我已经坐在这里至少一个小时了,还是没搞明白。我尝试了不同的解决方案,还读了一些数学公式,但在编写代码时就是得不到正确的答案!我做了两个不同的解决方案,但都给了我错误的结果。第一个方案的结果是265334,而第二个方案的结果是232169。正确答案是233168,所以第二个方案更接近。
我得提一下,这是来自Project Euler的第一个问题,具体来说就是这个。
这是我的代码。有没有人知道哪里出错了?
nums = [3, 5]
max = 999
result = 0
for num in nums:
for i in range(1,max):
if num*i < max:
result += num*i
print result
result = 0
for i in range(0,max):
if i%3 == 0 or i%5 == 0:
result += i
print result
19 个回答
3
我最喜欢这个:
def divisibles(below, *divisors):
return (n for n in xrange(below) if 0 in (n % d for d in divisors))
print sum(divisibles(1000, 3, 5))
18
你把事情想得太复杂了。其实你只需要一个包含3或5的倍数的数字列表,这个可以很简单地通过列表推导式来实现:
>>> [i for i in range(1000) if i % 3 == 0 or i % 5 == 0]
然后用sum
来计算总和:
>>> sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
<<< 233168
或者更好的是,使用生成器表达式来代替:
>>> sum(i for i in range(1000) if i % 3 == 0 or i % 5 == 0)
甚至可以更进一步(感谢Exelian):
>>> sum(set(list(range(0, 1000, 3)) + list(range(0, 1000, 5))))
6
range(k,max)
这个函数不会把 max
这个值算进去,所以你实际上是在检查到998(虽然999是3的倍数)。建议你用 range(1,1000)
来代替。