with Ada.Text_Io, Ada.Integer_Text_Io;
use Ada.Text_Io, Ada.Integer_Text_Io;
-- Tester si un nombre est parfait ou pas
-- Déf. : Un nombre parfait est un nombre entier
-- naturel qui est égal à la somme de ses diviseurs,
-- y compris 1, mais excepté lui-même bien entendu.
procedure Ex04a is
N, K : Natural;
Somme : Natural := 0;
begin
Put("Veuillez rentrer un nombre >= 1 : ");
Get(N);
-- Algo 1 non optimisé
Somme := 0;
for I in 1 .. N loop
if N mod I = 0 then -- k est un diviseur
Somme := Somme + I;
end if;
end loop;
Put("Algo 1 : N = "); Put(N, 0);
if Somme = N * 2 then
Put(" est");
else
Put(" n'est pas");
end if;
Put(" un nombre parfait.");
New_Line;
-----------------------------------------------------------------
-- Algo 2 optimisé
-- version optimisé : nous testons les diviseurs seulement
-- jusqu'a n / 2 car si k > n/2 => n / k < 2
Somme := 0;
for I in 1 .. N / 2 loop
if N mod I = 0 then -- k est un diviseur
Somme := Somme + I;
end if;
end loop;
Put("Algo 2 : N = "); Put(N, 0);
if Somme = N then
Put(" est");
else
Put(" n'est pas");
end if;
Put(" un nombre parfait.");
New_Line;
-----------------------------------------------------------------
-- Algo 3 "un peu plus optimisé"
K := 1;
-- autre optimisation, si nous dépassons la somme,
-- pas besoin de continuer
Somme := 0;
while K <= N / 2 and Somme <= N loop
if N mod K = 0 then -- k est un diviseur
Somme := Somme + K;
end if;
K := K + 1;
end loop;
Put("Algo 3 : N = "); Put(N, 0);
if Somme = N then
Put(" est");
else
Put(" n'est pas");
end if;
Put(" un nombre parfait.");
end;