Python 一点数学和逻辑知识

Python 一点数学和逻辑知识,python,math,logic,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:

所以我这里有一个问题:

如果我们列出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))
但当我将其设置为1000时,我得到:

Multiples of 3: 166833
Multiples of 5: 99500
Added: 266333

这被认为是错误的,有什么我没有得到的吗?

实际上,你需要在1000以下删除15的倍数,因为它将在3和5中重复。。这在10以下的情况下不会发生

Multiple of 3 & 5  = (multiple of 3 + multiple of 5 - multiple of 15)
因此,您可以使用
Set
存储这些倍数,以删除重复项

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


python的方法是使用列表理解(或生成器理解):


您遇到的问题是,您将15的倍数(其中
n%3==0和n%5==0
)包含两次,在一个列表中执行此操作可避免此类错误。

这将是Euler项目1号,是吗?太多了。我在第一个xD上失败了。不,我现在做得很好,从几到几。对于用作参数的生成器表达式,您不需要额外的括号:您只需编写
sum(如果n%3==0或n%5==0,则n代表xrange(1000)中的n)
。除此之外,这是最好的答案。
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)))
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))
sum( n for n in xrange(1,1000) 
        if n % 3 == 0 or n%5 == 0 )