TechMatt
TechMatt

Reputation: 93

Sum of multiples of 3 and 5

I have to calculate the sum of all the multiples of 3 and 5 (including themselves) in a range of a given N number (N excluded). I created a python code and it works with N = 10 but doesn't work for N = 100. I don't understand why.

This is the code:

#!/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))

Upvotes: 4

Views: 1176

Answers (3)

hiro protagonist
hiro protagonist

Reputation: 46921

you are counting the multiples of 15 (= 3 * 5) twice.

your code should be

for i in range(n):
    if i % 3 == 0:
        sum1 += i
    elif i % 5 == 0:
        sum1 += i

note the elif instead of if.

alternatively:

for i in range(n):
    if i % 3 == 0 or i % 5 == 0:
        sum1 += i

or directly (as DeepSpace suggests in the comments)

sum1 = sum(i for i in range(n) if 0 in {i % 3, i % 5})

note that there is no need for looping at all: knowing that the sum of the integers from 1 to (and including) n is

def sum_to(n): 
    return ((n+1)*n)//2

you can get your number from:

sum1 = 5 * sum_to((n-1)//5) + 3 * sum_to((n-1)//3) - 15 * sum_to((n-1)//15)

(that could be generalized and made somewhat prettier... but i'm sure you get the idea in this form).

Upvotes: 5

SpghttCd
SpghttCd

Reputation: 10890

EDIT:
In the meantime I saw @DeepSpace's solution in the comments, particularly the one with the if 0 in {i % 3, i % 5})-check - which I definitely admire; this is really smart!


I think I'd go this way, if you're interested in a different approach:

N = 100
sum(set(list(range(0, N, 3)) + list(range(0, N, 5))))
# 2318

Upvotes: 2

alinsoar
alinsoar

Reputation: 15813

Because 10 is less than 15, which is the least common multiple of 3 and 5.

You need to treat the particular case of 15.

Upvotes: 1

Related Questions