Sum multiples of 3 and 5: Difference between revisions

Content added Content deleted
(Ada version)
(Ada 202x version - Extra credit)
Line 93: Line 93:
<pre>n=1000: 233168
<pre>n=1000: 233168
n=5e9 : 5833333329166666668</pre>
n=5e9 : 5833333329166666668</pre>

===Extra Credit===
Requires upcoming Ada 202x with big integer package.
<lang Ada>with Ada.Text_IO;
with Ada.Numerics.Big_Numbers.Big_Integers;

procedure Sum_Multiples_Big is
use Ada.Numerics.Big_Numbers.Big_Integers;
use Ada.Text_IO;

type Natural is new Big_Natural;

function Sum_Mults (First, Last : Natural) return Natural is
High : constant Natural := Last - Last mod First;
Sum : constant Natural := (High / First) * (First + High) / 2;
begin
return Sum;
end Sum_Mults;

function Sum_35 (Limit : in Natural) return Natural is
Last : constant Natural := Limit - 1;
Mult_3 : constant Natural := Sum_Mults (3, Last);
Mult_5 : constant Natural := Sum_Mults (5, Last);
Mult_15 : constant Natural := Sum_Mults (15, Last);
begin
return Mult_3 + Mult_5 - Mult_15;
end Sum_35;

begin
Put_Line (" n : Sum_35 (n)");
Put_Line ("-----------------------------------------------------------------");
for E in 0 .. 30 loop
declare
N : constant Natural := 10**E;
begin
Put (To_String (N, Width => 32));
Put (" : ");
Put (Sum_35 (N)'Image);
New_Line;
end;
end loop;
end Sum_Multiples_Big;</lang>
{{out}}
<pre> n : Sum_35 (n)
-----------------------------------------------------------------
1 : 0
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
10000000000000000000000 : 23333333333333333333331666666666666666666668
100000000000000000000000 : 2333333333333333333333316666666666666666666668
1000000000000000000000000 : 233333333333333333333333166666666666666666666668
10000000000000000000000000 : 23333333333333333333333331666666666666666666666668
100000000000000000000000000 : 2333333333333333333333333316666666666666666666666668
1000000000000000000000000000 : 233333333333333333333333333166666666666666666666666668
10000000000000000000000000000 : 23333333333333333333333333331666666666666666666666666668
100000000000000000000000000000 : 2333333333333333333333333333316666666666666666666666666668
1000000000000000000000000000000 : 233333333333333333333333333333166666666666666666666666666668</pre>


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==