一点数学和逻辑

时间:2012-10-01 12:12:55

标签: python math logic

所以我在这里有这个问题:

  

如果我们列出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

这应该是错的,有什么我没有得到的吗?

3 个答案:

答案 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))