cours_ada/autres/nb_premiers/nb_premiers.adb
2021-08-22 13:24:45 +02:00

93 lines
2.2 KiB
Ada

with Ada.Text_Io;
use Ada.Text_Io;
with Ada.Numerics.Elementary_Functions;
use Ada.Numerics.Elementary_Functions;
procedure Nb_Premiers is
-- Variables parametres
subtype SIZE is Integer range 1..18;
-- Fonction de test de nb premiers
function Is_Prime(N : Long_Integer) return Boolean is
Prime : Boolean := True;
begin
if N mod Long_Integer(2) = 0 and N /= 2 then
Prime := False;
else
for I in 2..(Long_Integer(1.0+Sqrt(Float(N)))/2) loop
if N mod Long_Integer(2*I-1) = 0 then
Prime := False;
exit;
end if;
end loop;
end if;
return prime;
end Is_Prime;
-- Affichage nombre premier
procedure IP(N : Long_Integer) is
begin
if Is_Prime(N) then
Put_Line(Long_Integer'Image(N) & " premier");
else
Put_Line(Long_Integer'Image(N) & " n'est pas premier");
end if;
end IP;
-- Afficher les nb troncables d'une certaine taille
procedure Aff_Troncable(N : Long_Integer) is
--T_Min : constant Natural := 1; --Nombre de digits des nombres affichés
begin
Put_Line(Long_Integer'Image(N));
end Aff_Troncable;
-- Puissance de 10
function mode(M : Long_Integer) return Long_Integer is
I : Long_Integer := 0;
N : Long_Integer := M;
begin
while N >= 0 loop
N := N - 10**(Integer(I));
I := I + 1;
end loop;
return I;
end mode;
-- Recherche de nombres premiers tromcables
procedure Troncable(N : Long_Integer) is
N3 : Long_Integer := 0;
begin
if Is_Prime(N) then
Aff_Troncable(N);
if N < (Long_Integer'Last / 100) then
for I in 1..9 loop
N3 := 10;
for J in 1..(Mode(N) - 2) loop
N3 := N3 * 10;
end loop;
Troncable(N + Long_Integer(I)*N3);
end loop;
elsif N < (Long_Integer'Last / 11) then
for I in 1..8 loop
N3 := 10;
for J in 1..(Mode(N) - 2) loop
N3 := N3 * 10;
end loop;
Troncable(N + Long_Integer(I)*N3);
end loop;
end if;
end if;
end Troncable;
begin
Troncable(Long_Integer(2));
Troncable(Long_Integer(3));
Troncable(Long_Integer(5));
Troncable(Long_Integer(7));
end Nb_Premiers;