如何在Python中找到小于1000的所有3或5的倍数之和?

12 投票
19 回答
82435 浏览
提问于 2025-04-16 17:14

我不太确定我是不是应该把这个问题发到数学论坛上,但因为它涉及到更多的编程内容,所以我选择在这里发。

这个问题看起来很简单,但我已经坐在这里至少一个小时了,还是没搞明白。我尝试了不同的解决方案,还读了一些数学公式,但在编写代码时就是得不到正确的答案!我做了两个不同的解决方案,但都给了我错误的结果。第一个方案的结果是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) 来代替。

撰写回答