Составить программу для проверки утверждения: « Результатами вычислений по формуле (x*х) + x + 49 при 0<=x<= 40 являются простые числа». Все результаты вывести на экран.
Program Proverka;
Var x,p,r,d:integer;
begin
writeln('Resyltatom vichislenii po formule x*x+x+49');
writeln('pri 0<=x<=40');
writeln('yavlyaetsya prostoe chislo');
for x:=0 to 40 do
p:=(x*x)+x+49;
d:=2;
repeat r:=p mod d;
if r<>0 then d:=d+1;
until r=0;
if d=p then writeln('ytver*denie verno')
else writeln('ytverjdenie ne verno');
readln;
end.
М | Используй теги! Lapp |
предложений пока ровно 2:
1. использовать теги при выкладывании программ
2. запустить поиск.
если не поможет - буду думать дальше.
Во-первых, у тебя тело первого цикла (по x) не взято в операторные скобки.
Во-вторых, второй цикл не закончится, если утверждение верно.
Короче, я бы сделал типа так..
Var
x,p,r,d,sp:integer;
Yes:boolean;
begin
Yes:=true;
for x:=0 to 40 do begin
p:=(x*x)+x+49;
sp:=Trunc(Sqrt(p));
for d:=2 to sp do begin
r:=p mod d;
Yes:=Yes and(r>0);
{if r=0 then writeLn(x,' ',d)}
end
end;
if Yes then WriteLn('Correct') else WriteLn('Incorrect');
readln;
end.
оо, пасиба большое... щас пойду разбираться)
sp:=Trunc(Sqrt(p));
for d:=2 to sp do begin
r:=p mod d;
Yes:=Yes and(r>0);
end.
ну смотри.
допустим, у тебя есть число 20. его можно представить так: (идем по порядку):
2*10
4*5
5*4
10*2
как видишь, каждое выражение встречается 2 раза.
значит, нам достаточно изучить только половину. ясное дело, что середина - это корень из 20. один множитель всегда будет больше или равен, а другой меньше или равен.
но корень - не всегда целое число. А граница цикла - обязательно целое... Поэтому нам приходится округлять.