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