Sum multiples of 3 and 5: Difference between revisions

Line 2,500:
10000000000000000000 23333333333333333331666666666666666668
100000000000000000000 2333333333333333333316666666666666666668
</pre>
 
=={{header|PHP}}==
 
Naive version (slow) :
 
<lang PHP>$max = 1000;
$sum = 0;
for ($i = 1 ; $i < $max ; $i++) {
if (($i % 3 == 0) or ($i % 5 == 0)) {
$sum += $i;
}
}
echo $sum, PHP_EOL;
</lang>
 
{{out}}
<pre>233168</pre>
 
Fast version:
 
<lang PHP>function sum_multiples($max, $divisor) {
// Number of multiples of $divisor <= $max
$num = floor($max / $divisor);
// Sum of multiples of $divisor
return ($divisor * $num * ($num + 1) / 2);
}
 
$max = 1000;
$sum = sum_multiples($max - 1, 3)
+ sum_multiples($max - 1, 5)
- sum_multiples($max - 1, 15);
echo $sum, PHP_EOL;</lang>
 
{{out}}
<pre>233168</pre>
 
{{libheader|GMP}}
 
Fast version using GNU Multiple Precision library.
These functions allow for arbitrary-length integers to be worked with.
 
<lang PHP>function sum_multiples_gmp($max, $divisor) {
// Number of multiples of $divisor <= $max
$num = gmp_div($max, $divisor);
// Sum of multiples of $divisor
return gmp_div(gmp_mul(gmp_mul($divisor, $num), gmp_add($num, 1)), 2);
}
 
for ($i = 0, $n = gmp_init(10) ; $i < 21 ; $i++, $n = gmp_mul($n, 10)) {
$max = gmp_sub($n, 1);
$sum =
gmp_sub(
gmp_add(
sum_multiples_gmp($max, 3),
sum_multiples_gmp($max, 5)
),
sum_multiples_gmp($max, 15)
);
printf('%22s : %s' . PHP_EOL, gmp_strval($n), $sum);
}</lang>
 
{{out}}
<pre> 10 : 23
100 : 2318
1000 : 233168
10000 : 23331668
100000 : 2333316668
1000000 : 233333166668
10000000 : 23333331666668
100000000 : 2333333316666668
1000000000 : 233333333166666668
10000000000 : 23333333331666666668
100000000000 : 2333333333316666666668
1000000000000 : 233333333333166666666668
10000000000000 : 23333333333331666666666668
100000000000000 : 2333333333333316666666666668
1000000000000000 : 233333333333333166666666666668
10000000000000000 : 23333333333333331666666666666668
100000000000000000 : 2333333333333333316666666666666668
1000000000000000000 : 233333333333333333166666666666666668
10000000000000000000 : 23333333333333333331666666666666666668
100000000000000000000 : 2333333333333333333316666666666666666668
1000000000000000000000 : 233333333333333333333166666666666666666668
</pre>
 
Anonymous user