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. -- Exercice supplémentaire : affichier tous les nombres -- parfaits appartenant aux naturels d'ada -- conseil : allez prendre un café ! -- 6 - 28 - 496 - 8 128 - 33 550 336 procedure Ex04b is K : Natural; Somme : Natural; begin for N in Natural'Range loop K := 2; Somme := 1; -- version optimisé : nous testons les diviseurs seulement -- jusqu'a n / 2 car si k > n/2 => n / k < 2 -- autre optimisation, si nous dépassons la somme, -- pas besoin de continuer 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; if N mod 5000 = 0 then Put_Line("n = " & Integer'Image(N)); end if; if Somme = N then Put_Line("N =" & Integer'Image(N) & " est un nombre parfait."); end if; end loop; end;