{ File: primi2.pas }

{ Scopo: esercizio sull'uso di cicli e di funzioni }

program NumeriPrimi2;

var
  numero : integer;

  function TestDivisibile (n: integer): boolean;
  { verifica se il numero n e` divisibile }
  var
    i    : integer;
    temp : boolean; 	{ valore booleano che facciammo corrispondere
                          all'affermazione  "trovato un divisore per n" }
  begin
    { il procedimento consiste nel cercare di dimostrare che il numero
      non e' primo (perche' troviamo un divisore).  Allora inizialmente
      poniamo 'temp' = FALSE.  Se durante il ciclo di ricerca dei divisori
      troviamo un divisore, temp diventa TRUE e il ciclo deve interrompersi. }

    if (n mod 2) = 0 then
      temp := TRUE
    else
      temp := FALSE;
    { Verifichiamo se il numero e' pari e inizializziamo di conseguenza temp.
      Poi inizializziamo i a 3 (perche' il controllo su 2 lo abbiamo gia'
      fatto.
      si entra nel ciclo successivo solo se il numero non e' divisibile per 2.
      Quindi e' inutile controllare se il numero e' divisibile per 4, 6 etc ...
      Quindi durante il ciclo verificheremo se n mod i = 0 solo per i valori di
      i = 3, 5, 7 ... cioe' incrementeremo i in modo da saltare i valori pari.
      }

    i := 3;

    while ((i <= sqrt(n)) and not temp) do
    begin
      if (n mod i) = 0 then
        temp := TRUE;
      i := i + 2;
    end;
    TestDivisibile := temp;
  end; {TestDivisibile}

begin { NumeriPrimi2 }
  writeln;
  write('Inserire un numero? ');
  readln(numero);

  write('Il numero proposto ');
  if TestDivisibile(numero) then
    writeln('non e'' primo.')
  else
    writeln('e'' primo.');
  readln
end. { NumeriPrimi2 }