Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ простые числа

Автор: compiler 29.04.2007 19:25

Добрый день!
написал свою функцию проверяющею простоту числа, а она не работает. Покажите пожалуйста ошибку.

var
den,d:integer;
function simple(a:integer):boolean;
var
i: integer;
begin
simple:=true;
i:=2;
while (i< (trunc(sqrt(a)) )) and (simple=true)do begin
if a mod i = 0 then simple:=false;
inc(i);
end;
end;
begin
ReadLn(d);

for den:=0 to d do begin
if simple(den)=true then
writeLn(den);
end;
ReadLn(d);
end.

Заранее благодарен
ЗЫ да, я знаю про то что в ЧаВо есть подобная функция..

Автор: klem4 29.04.2007 19:27

Цитата
я знаю про то что в ЧаВо есть подобная функция..


И чем она тебе не понравилась ?

Автор: compiler 29.04.2007 19:31

Цитата(klem4 @ 29.04.2007 15:27) *
И чем она тебе не понравилась ?
Exit-ом.

Автор: klem4 29.04.2007 19:35




function simple(a:integer):boolean;
var
i: integer;
s: boolean;
begin
s:=true;
i:=2;
while (i<= (trunc(sqrt(a)) )) and (s=true)do begin
if a mod i = 0 then
s:=false;
inc(i);
end;
simple := s;
end;


ps
Можно сделать и без exit'a в одну строчку ...

Автор: compiler 29.04.2007 19:46

klem4, конечно спасибо но почему при знаке < вместо <= функция работает не коректна

Автор: klem4 29.04.2007 19:51

потомучто максимальным делителем числа может быть значение равное квадратному корню из этого числа, а при строгом неравенстве это не учитывается

вот такой вариант еще:

function Simple(n, i: Integer): Boolean;
begin
if i > trunc(sqrt(n)) then Simple := true else
if (n mod i = 0) then Simple := false else simple := (Simple(n, i + 1));
end;


вызов

 for i := 1 to 20 do
if simple(i, 2) then writeln(i);