eratosthenes.adbDenna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
-- Eratosthenes såll är en gammal grekisk algoritm som hittar alla primtal
-- upp till en given gräns.
procedure Eratosthenes is
Max : constant Integer := 20000;
Count, K, Prime, Maxsize : Integer;
Mark : Boolean;
Flags : array(0 .. Max) of Boolean;
begin
Put("Ange övre gräns (max " & Integer'Image(Max) & "): ");
Get(Maxsize);
if Maxsize > Max then
Put_Line("Jag vill inte räkna länge än till " &
Integer'Image(Max) & ".");
return;
end if;
New_Line(1);
Put_Line("I intervallet 3 .. " & Integer'Image(Maxsize) &
" finns följande primtal:");
Put_Line("-----------------------------------------------");
Maxsize := (Maxsize - 1) / 2;
Count := 0;
Mark := true;
for I in Integer range 0 .. Maxsize loop
Flags(I) := true;
end loop;
for I in Integer range 1 .. Maxsize loop
if Flags(I) then
prime := I + I + 1;
Put(Prime, Width=>8);
Count := Count + 1;
if Mark then
K := (I + I) * (I + 1);
if (K > Maxsize) or (K < 0) then
Mark := False;
else
while (K <= Maxsize) and (K > 0) loop
Flags(K) := false;
K := K + Prime;
end loop;
end if;
end if;
end if;
end loop;
New_Line(2);
Put_Line("Totalt " & Integer'Image(Count) & " primtal.");
end Eratosthenes;
|