我必须在给定的N个数(不包括N个)的范围内计算3和5(包括它们自己)的所有倍数的总和。我创建了一个python代码,它适用于N = 10,但不适用于N =100。我不明白为什么。
这是代码:
#!/bin/python3
import sys
def multiples_sum(n):
sum1 = 0
for i in range(n):
if i % 3 == 0:
sum1 = sum1 + i
if i % 5 == 0:
sum1 = sum1 + i
return sum1
t = int(input().strip())
for a0 in range(t):
n = int(input().strip())
print(multiples_sum(n))
答案 0 :(得分:5)
您正在计算15的倍数(= 3 * 5)。
您的代码应为
for i in range(n):
if i % 3 == 0:
sum1 += i
elif i % 5 == 0:
sum1 += i
注意用elif
代替if
。
或者:
for i in range(n):
if i % 3 == 0 or i % 5 == 0:
sum1 += i
或直接(如DeepSpace在评论中建议的那样)
sum1 = sum(i for i in range(n) if 0 in {i % 3, i % 5})
请注意,根本不需要循环:知道1到(包括)n
的整数之和是
def sum_to(n):
return ((n+1)*n)//2
您可以通过以下方式获取电话号码:
sum1 = 5 * sum_to((n-1)//5) + 3 * sum_to((n-1)//3) - 15 * sum_to((n-1)//15)
(可以概括为更漂亮的内容,但是我敢肯定您会以这种形式得到这个想法)。
答案 1 :(得分:2)
编辑:
同时,我在评论中看到了@DeepSpace的解决方案,尤其是带有if 0 in {i % 3, i % 5})
-check的解决方案-我非常佩服;这真的很聪明!
如果您对其他方法感兴趣,我想我会走这条路:
N = 100
sum(set(list(range(0, N, 3)) + list(range(0, N, 5))))
# 2318
答案 2 :(得分:1)
因为10小于15,这是3和5的最小公倍数。
您需要处理15的特殊情况。