所以我在这里有这个问题:
如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9。 这些倍数的总和是23.
求出1000或以下所有3或5的倍数之和。
我在这里写道:
def multiples(num, below):
counter = 1
z = 0
while True:
x = num * counter
if x < below:
z += x
else:
break
counter += 1
return z
below = 1000
print "Multiples of 3: " + str(multiples(3, below))
print "Multiples of 5: " + str(multiples(5, below))
print "Added: " + str(multiples(3, below) + multiples(5, below))
如果我将below
设置为10,我会得到正确答案,23
Multiples of 3: 18
Multiples of 5: 5
Added: 23
但是当我把它设置为1000时,我得到了这个:
Multiples of 3: 166833
Multiples of 5: 99500
Added: 266333
这应该是错的,有什么我没有得到的吗?
答案 0 :(得分:7)
实际上你需要在1000以下删除15的倍数,因为它将在3&amp; 3中重复。 5 ..低于10的情况不会发生..
Multiple of 3 & 5 = (multiple of 3 + multiple of 5 - multiple of 15)
因此,您可以使用Set
来存储这些倍数,以删除重复的内容。
答案 1 :(得分:3)
执行此操作的Pythonic方法是使用list-comprehension(或generator-comprehension):
sum( n for n in xrange(1,1000)
if n % 3 == 0 or n%5 == 0 )
您遇到的问题是您包含两次十五次(n%3==0 and n%5==0
次)的倍数,在一个列表中执行此操作可以避免此类错误。
答案 2 :(得分:1)
multiples_of_3 = range(0,1000,3)
multiples_of_5 = range(0,1000,5)
sum_of_multiples = sum(set(itertools.chain(multiples_of_3, multiples_of_5)))
OR
multiples_of_3 = range(0,1000,3)
multiples_of_5 = range(0,1000,5)
multiples_of_15 = set(range(0,1000,15))
sum_of_multiples = sum(set(i for i in itertools.chain(multiples_of_3, multiples_of_5) if i not in multiples_of_15))