P1
projecteuler.net

Multiples of 3 or 5

ℹ️Published on Friday, 5th October 2001, 06:00 pm; Solved by 1025302;
Difficulty rating: 5%

If we list all the natural numbers below $10$ that are multiples of $3$ or $5$, we get $3, 5, 6$ and $9$. The sum of these multiples is $23$.

Find the sum of all the multiples of $3$ or $5$ below $1000$.



Soluzione

Formalmente, vorremo trovare

S=n[1,1000)n0 mod (3,5)n=3+5+6+9+10+12++999 S = \sum_{\substack{n \in [1,1000) \\ n \equiv 0 \text{ mod } (3,5)}} n = 3+5+6+9+10+12+\ldots + 999

Quindi l'idea è che possiamo calcolare questa somma raccogliendo tutti i fattori di 3 e 5, ottenendo 3(1+2++h)+5(1+2++k)3(1+2+\ldots+h)+5(1+2+\ldots+k), con hh e kk i limiti opportuni per ottenere un loro multiplo senza sforare 1000, quindi h=333h=333 e k=199k=199. In questo modo però staremmo contando due volte i multipli di 3 e 5, come 15, 30, 45, ecc; quindi occorre correggere il calcolo sottraendo per i multipli di 15, ovvero 15(1+2++r)15(1+2+\ldots+r), dove il limite rr ora corrisponde a 66 (dato che 1566=99015\cdot66 = 990 mentre 1567=100515\cdot 67 = 1005). Dopodiché, si può calcolare SS applicando sulle varie somme la formuletta

i=1ni=n(n+1)2 \sum_{i=1}^n i = \frac{n(n+1)}{2}

Questo esercizio si può quindi risolvere tranquillamente su carta, e questa sarebbe la sua formulazione equivalente in codice

sum_to_n(n) = n*(n+1)/2 # o anche solo sum(collect(1:n))
S = 3*sum_to_n(333) + 5*sum_to_n(199) - 15*sum_to_n(66)
233168.0

ma comunque ci si può ovviamente arrivare anche con approcci puramente informatici:

# one-liner
sum([i for i in 1:999 if (i%3==0 || i%5==0)])
233168
# simulazione estesa
S = 0
for i in 1:999
	if i%3 == 0 || i%5 == 0
		global S += i
	end
end
@show S
S = 233168
Last modified: May 01, 2025. Website built with Franklin.jl and the lovely Julia programming language.