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)两次。

解决它的一种方法是添加:

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。这与3 6 9 12 15 18 21 24 27 30 33 36 39 UNION 5 10 15 20 25 30 35 40现在认识到3 6 9 12 ...与 相同,并且与五相同3 * (1 2 3 4...),我们可以将“单位和”(与. 好消息是单位和可以在恒定时间内计算,因为唯一的问题是 15 的倍数将在那里两次(在 5s 和 3s 中计算)所以我们必须将它们减去也是。1 2 3 4n / mult3 * (1 2 3 4)n * (n + 1)

于 2012-07-27T21:05:08.670 回答
1

它应该非常快,非常易读,并且可以在 CPython 2.x 和 3.x 上运行。我已经 #!'d 给 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 回答
1

使用生成器表达式,这是一个单行

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