Corrigé Nombres parfaits, nombres amis

1

PROGRAM Diviseur;
VAR n, diviseur, somme : INTEGER;
BEGIN
  Write('Entrez un entier n? '); ReadLn(n);
  somme := 0; { Initialisation de la somme }
  FOR diviseur := 1 TO n DIV 2 DO  { n - 1  marche aussi }
    IF n MOD diviseur = 0 THEN
      somme := somme + diviseur;
  WriteLn('La somme est : ',somme);
END.

2

FUNCTION SommeDiviseurs(n : INTEGER) : INTEGER;
VAR diviseur, somme : INTEGER;
BEGIN
  somme := 0;
  FOR diviseur := 1 TO n DIV 2 DO
    IF n MOD diviseur = 0 THEN
      somme := somme + diviseur;
  SommeDiviseurs := somme;
END.

PROGRAM Parfait;
{ FUNCTION SommeDiviseurs(n : INTEGER) : INTEGER; }
VAR n, entier : INTEGER;
BEGIN
  Write('Entrez un entier n? '); ReadLn(n);
  FOR entier := 1 TO n DO
    IF SommeDiviseurs(entier) = entier THEN
      WriteLn(entier);
END.

4

Utiliser la fonction SommeDiviseurs dans un programme qui affiche la liste de tous les couples de nombres amis inférieurs tous les deux à un nombre N saisi au clavier.

PROGRAM Amis;
{ FUNCTION SommeDiviseurs(n : INTEGER) : INTEGER; }
VAR n, entier, somme : INTEGER;
BEGIN
  Write('Entrez un entier n? '); ReadLn(n);
  FOR entier := 1 TO n DO
  BEGIN
    { On stocke dans une variable, pour ne pas }
    { avoir à faire ce calcul plusieurs fois   }
    somme := SommeDiviseurs(entier);
    { On n'affiche qu'une fois chaque couple }
    IF ( somme >= entier ) AND ( somme <= n ) AND
        SommeDiviseurs(somme) = entier THEN
      WriteLn('(',entier,',',somme,')');
  END;
END.