program testPrvociselnostiII;
{ Vstup: číslo x (vejde se do integeru).
Výstup: řetězec 'ano', pokud je zadané číslo prvočíslo; v opačném případě 'ne'.
Myšlenka řešení: Postupně zkoušíme, zda je x dělitelné některým z menších čísel, než je ono samo.
Stačí nám vyzkoušet dělitelnost čísly 2, 3, ... odmocnina(x).
Proč? (Kdo si to nepamatujete ze cvičení, zkuste si rozmyslet, proč není možné,
aby nejmenší dělitel čísla x byl větší než odmocnina z x.)
Právě tehdy když je alespoň jedním z nich x dělitelné, není x prvočíslo. }
var x,i : integer;
prvocislo : boolean; { Tato proměnná je true, pokud x je prvočíslo. }
begin
read(x);
prvocislo:=true; {Na začátku předpokládáme, že x je prvočíslo. }
for i:=2 to trunc(sqrt(x)) do
if (x mod i = 0) then
begin
prvocislo := false; { Narazíme-li na dělitele x, víme, že x není prvočíslo. }
break; { Pak ale není třeba zkoumat vyšší i ==> vyskočíme z cyklu a pokračujeme rovnou výpisem. }
end;
if (prvocislo) then { Pokud žádné z čísel 2,...,trunc(sqrt(x)) nedělilo x, zůstala proměnná x nastavená na true.}
writeln('ano')
else { Pokud některé z čísel 2,...,trunc(sqrt(x)) dělilo x, změnili jsme proměnnou x na false.}
writeln('ne');
end.
Kdo byste našel v nějakém z těchto programů chybu, dejte mi to vědět - můžete tak získat bonusové body (1 chyba ≈ 5 bodů). ;)