求和3和5的乘数的整数溢出

时间:2012-07-27 20:48:48

标签: python

我确信这个问题已被提出很多问题,但我已经检查了其他论坛并试图解决这个问题,这似乎没有帮助。我在想有一个溢出问题,但我不记得如何解决它。我在编码方面做了很长时间的休息(我的错在那里)所以我正在尝试一些问题来帮助让我重新回到原点。所以,只是想知道出了什么问题。当我尝试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()

5 个答案:

答案 0 :(得分:3)

问题在于你计算的数字是3和5(如15)两倍的数字。

解决问题的一种方法是添加:

if counter3%5 == 0: continue

跳过重复计算。

答案 1 :(得分:3)

您目前正在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...)相同,并且与五个相同,我们可以采用“单位总和”(1 2 3 4)最多为术语数n / mult,并将该总和乘以多数,就像我们使用3 * (1 2 3 4)一样。好消息是单位总和可以在恒定时间内计算,如n * (n + 1)唯一的问题是那些15的多数将在那里两次(在5s和3s都计算)所以我们也必须减去它们。

答案 2 :(得分:1)

看起来你重复计算15的倍数。

答案 3 :(得分: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))

答案 4 :(得分:1)

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

result = sum(num for num in xrange(1000) if (num % 5 ==0) or (num % 3 == 0))