3

だから私はここにこの問題があります:

3 または 5 の倍数である 10 未満の自然数をすべてリストすると、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))

10に設定belowすると、正しい答え 23 が得られます

Multiples of 3: 18
Multiples of 5: 5
Added: 23

しかし、これを 1000 に設定すると、次のようになります。

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

そして、これは間違っていると思われます。私が得ていないものはありますか?

4

3 に答える 3

7

実際には、3 と 5 の両方で重複するため、1000 を下回ると 15 の倍数を削除する必要があります。これは 10 未満では起こりません。

Multiple of 3 & 5  = (multiple of 3 + multiple of 5 - multiple of 15)

したがって、 a を使用しSetてそれらの倍数を保存し、重複を削除できます..

于 2012-10-01T12:14:45.863 に答える
3

これを行う Pythonic の方法は、リスト内包表記 (またはジェネレーター内包表記) を使用することです。

sum( n for n in xrange(1,1000) 
        if n % 3 == 0 or n%5 == 0 )

.

あなたが抱えていた問題は、15 の倍数 ( n%3==0 and n%5==0) を 2 回含めていたことです。1 つのリストでこれを行うと、この種のエラーを回避できます。

于 2012-10-01T12:18:53.257 に答える
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)))

また

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))
于 2012-10-01T12:15:05.093 に答える