What I learned from writing six functions that all did the same thing
Jackson Bates
1K36

Nice!

About the Math that seems confusing… See this:

How many divisions can (N-1) be splited into by 3 and 5? (-1 since we are looking for numbers "below" it).

var threes = Math.floor((N - 1) / 3);
var fives = Math.floor((N - 1) / 5);

Then, If we are accounting for numbers that are EITHER multiple by 3 and 5, threes and fives would be duplicated every 15 (3*5) steps (for instance: from 1–16, we have [3,6,9,12,15] and [5,10,15], where '15' is duplicated in both. So we can find the amount of 15’s as well by:

var fifteens = Math.floor((N - 1) / 15);

After that, the total number of threes, fives and fifteens are discovered. If I'm not mistaken, just for a sake of understanding, the total "numbers" could be calculated as:

var totalNumbers = threes + fives - fifteens;

where the -fifteensis used to account for duplicated numbers that are both 3/5 multiplers.

To continue, in order to know the SUM of those numbers (for instance: Given that we have 5 multiplers of 3; 3 multiplers of 5; and 1 multipler of fifteen; we can square it and multiply by the multipler (imagine that the bigger the number, even bigger the sum gets).

var sumThrees = (3 * threes * (threes + 1)) / 2;

For instance:[3, 6, 9, 12, 15], (3*5*6)/2 = 45 = 3+6+9+12+15

As you can see, this is basically, the "half-area" of a square scaled by the multiplier.

And to complete, we can do everything simplified:

var total = 
+ 0.5 * ( 3 * threes * (threes + 1))
+ 0.5 * ( 5 * fives * (fives + 1))
- 0.5 * (15 * fifteen * (fifteen + 1));

And becomes in a much faster way (without floating point multiplication, and with the division placed as common divider outside parentesis:

(3 * threes * (threes + 1) + 5 * fives * (fives + 1) - 15 * fifteen * (fifteen + 1)) / 2;

Really clever.. And nice post!