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

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

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

Автор: Танкистка 25.11.2006 1:09

Составить программу для проверки утверждения: « Результатами вычислений по формуле (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


Автор: мисс_граффити 25.11.2006 1:15

предложений пока ровно 2:
1. использовать теги при выкладывании программ
2. запустить поиск.
если не поможет - буду думать дальше.

Автор: lapp 25.11.2006 19:19

Во-первых, у тебя тело первого цикла (по 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.

Можно добавить break'и, чтоб выходило сразу по нахождении первого делителя, но оно и так быстро считается..
Закомментированный оператор позволяет увидеть, какие именно значения не простые (если захочется smile.gif ).

Автор: Танкистка 26.11.2006 16:58

оо, пасиба большое... щас пойду разбираться)

Автор: Танкистка 30.11.2006 0:16

Цитата


sp:=Trunc(Sqrt(p));
for d:=2 to sp do begin
r:=p mod d;
Yes:=Yes and(r>0);
end.



я немного не понимаю что такое sp??? почему именно до него.... может кто-нить на примере объяснить...???
ну, мы получаем какое-то число р... ну а зачем мы потом берем от него корень, а потом оставляем целую часть??? почему у нас цикл до этого числа? это разве будет корректная проверка на простоту?? Ааа!!!!... или я ваще чет не поняла.. вот.. Вообщем, кто может помогите...

Автор: мисс_граффити 30.11.2006 0:50

ну смотри.
допустим, у тебя есть число 20. его можно представить так: (идем по порядку):
2*10
4*5
5*4
10*2
как видишь, каждое выражение встречается 2 раза.
значит, нам достаточно изучить только половину. ясное дело, что середина - это корень из 20. один множитель всегда будет больше или равен, а другой меньше или равен.
но корень - не всегда целое число. А граница цикла - обязательно целое... Поэтому нам приходится округлять.