Problem Description
Link to Project Euler problem 1
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.
WARNING Solution ahead. Don’t read more if you want to enjoy the benefits of Project Euler and you haven’t already solved the problem.
Solution
The simple way is to go through all numbers from 1 to 999 and test whether they are divisible by 3 or by 5. In Haskell you could use list comprehension:
solution = sum [n | n <- [1..999], n `mod` 3 == 0 || n `mod` 5 == 0]
Reading the solution notes from the project’s site, we can see that the solution could even be expressed as:
solution' = sum [n | n <- [1..999], n `mod` 3 == 0] +
sum [n | n <- [1..999], n `mod` 5 == 0] -
sum [n | n <- [1..999], n `mod` 15 == 0]
Noting that:
$$ 3+6+9+12+15+\dots+999 = 3\times(1+2+3+4+\dots+333) $$ $$ 5+10+15+\dots+995 = 5\times(1+2+\dots+199) $$
where $333=\frac{999}{3}$ and $199=\frac{995}{5}$ but also $\frac{999}{5}$ rounded down to the nearest integer.
And that from the expression for arithmetic progression:
$$ S_n=\frac{n}{2}(a_1+a_n) $$
we can derive that:
$$ 1+2+3+\dots{}+p=\frac{p}{2}(1+p) $$
We could write an efficient solution:
target = 999
sumDivisibleBy n = n * p * (1 + p) `div` 2
where
p = target `div` n
solution'' = sumDivisibleBy 3 + sumDivisibleBy 5 - sumDivisibleBy 15
You can find the Literate Haskell code on GitHub and on Bitbucket.