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;