0

この質問は多く寄せられていると思いますが、他のフォーラムをチェックして問題に対処しようとしましたが、役に立たないようです. オーバーフローの問題があると思いますが、修正方法を思い出せません。私はコーディングから長い休憩を取ったので(私のせいです)、物事のスイングに戻るのを助けるためにいくつかの問題を試みています. だから、何がうまくいかないのか疑問に思っています。私が試しn = 1000てみると答えは間違っていますが、それよりも小さい数字はうまくいくようです。大きな数は機能しないので、整数オーバーフローだと思います。

def n_number():
    n = raw_input("Enter a max number: ")
    try:
        int(n)
        return n

    except ValueError:
        print 'Value is not an integer'
        exit(1)

# 'function that will add multiples of 3 and 5 that are less than the given value, n.'
def sum_multiplies(n):
    sum = long(0)
    counter3, counter5 = int(1),int(1)

    value3 = 3*counter3
    value5 = 5*counter5

    while True:
        # 'sums of multiples of 5\'s less than n'
        if value5<int(n):
            sum+= value5
            counter5+=1
            value5 = 5*counter5

        # 'sums of multiples of 3\'s less than n'
        if value3<int(n):
            sum+= value3
            counter3+=1
            value3 = 3*counter3

        else:
            break

    print "sum: %s" %sum
    print "counter3: %s" %counter3
    print "counter5: %s" %counter5

def main():
    'max number is in n'
    n = n_number()

    sum_multiplies(n)

if __name__ == "__main__":
    main()
4

5 に答える 5

3

問題は、3 と 5 の両方の倍数 (15 など) を 2 回数えていることです。

それを解決する 1 つの方法は、次を追加することです。

if counter3%5 == 0: continue

ダブルカウントをスキップします。

于 2012-07-27T20:53:26.543 に答える
2

あなたは現在これをO(n)時間内に行っています - あなたは一定の時間でそれを行うことができます!

' sum values from 1 to m'
def unitSum(m):
    return (m * (m + 1)) / 2

def sum_multiplies(n):
    threes = int(n / 3)
    fives = int(n / 5)
    fifteens = int(n / 15)
    threesum = unitSum(threes) * 3
    fivesum = unitSum(fives) * 5
    fifteensum = unitSum(fifteens) * 15
    return threesum + fivesum - fifteensum

Python の知識が不足していることをご容赦ください。私は Java 派です。偶然の構文エラーがあるかもしれません。しかし、ここでの考え方は、 の例ではn = 40、 を合計しているということです3 5 6 9 10 12 15 18 20 21 24 25 27 30 33 35 36 39 40。これは と同じですが と同じであり、5 と同じで3 6 9 12 15 18 21 24 27 30 33 36 39 UNION 5 10 15 20 25 30 35 40あることを認識すると、「単位和」 ( ) を項の数 ( ) まで取り、その和に mult を掛けることができます。とします。良いニュースは単位和が一定時間で計算できることです.同じように。3 6 9 12 ...3 * (1 2 3 4...)1 2 3 4n / mult3 * (1 2 3 4)n * (n + 1)

于 2012-07-27T21:05:08.670 に答える
1

ジェネレータ式を使用して、ここにワンライナーがあります

result = sum(num for num in xrange(1000) if (num % 5 ==0) or (num % 3 == 0))
于 2012-07-27T21:34:30.580 に答える
1

それは非常に高速で読みやすく、CPython 2.x および 3.x で動作するはずです。私は pypy に #! しましたが、それは必然ではありません。range() は 2.x では熱心で、3.x では怠惰であることに注意してください。

#!/usr/local/pypy-1.9/bin/pypy

divisible_by_3 = set(range(0, 1000, 3))
divisible_by_5 = set(range(0, 1000, 5))

divisible_by_either = divisible_by_3 | divisible_by_5

print(sum(divisible_by_either))
于 2012-07-27T21:31:09.410 に答える
1

15 の倍数を二重に数えているようです。

于 2012-07-27T20:54:20.723 に答える