.
..
ex01a.adb (download) (view)
ex01b.adb (download) (view)
ex02a.adb (download) (view)
ex02b.adb (download) (view)
ex03a.adb (download) (view)
ex03b.adb (download) (view)
ex04a.adb (download) (view)
ex04b.adb (download) (view)
ex05a.adb (download) (view)

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;
 
Webmaster : pierrefrancois.leon@laposte.net

Valid XHTML 1.0 Strict Valid CSS!