I’m given a number and I need to find the sum of the multiples of 3 and 5 below the number. For example: 20 => 78 = 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18
My code works, but not for numbers greater than 1,000,000 (I tested it for 100,000 – it gives the result with 2sec delay). So, it should be optimized. Could someone help me? Why is my code slow? Thanks.
My logic is as follows:
- add multiples to an array
- filter duplicate values
- sum all values
my code:
JavaScript
x
22
22
1
function sumOfMultiples(number) {
2
3
let numberBelow = number - 1;
4
let numberOfThrees = Math.floor(numberBelow / 3);
5
let numberOfFives = Math.floor(numberBelow / 5);
6
let multiples = [];
7
let multipleOfThree = 0;
8
let multipleOfFive = 0;
9
10
for (var i = 0; i < numberOfThrees; i++) {
11
multiples.push(multipleOfThree += 3);
12
}
13
14
for (var j = 0; j < numberOfFives; j++) {
15
multiples.push(multipleOfFive += 5);
16
}
17
18
return multiples
19
.filter((item, index) => multiples.indexOf(item) === index)
20
.reduce((a, b) => a + b);
21
}
22
Advertisement
Answer
You can just run a loop from 1
to number
, and use the modulo operator %
to check if i
divides 3
or 5
:
JavaScript
1
15
15
1
function sumOfMultiples(number) {
2
var result = 0;
3
4
for (var i = 0; i < number; i++) {
5
if (i % 5 == 0 || i % 3 == 0) {
6
result += i;
7
}
8
}
9
10
return result;
11
}
12
13
console.log(sumOfMultiples(1000));
14
console.log(sumOfMultiples(100000));
15
console.log(sumOfMultiples(10000000));