3和5的倍数之和

时间:2019-03-18 12:10:38

标签: python

我必须在给定的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))

3 个答案:

答案 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的特殊情况。