Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с исп. цикла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Танкистка
Составить программу для проверки утверждения: « Результатами вычислений по формуле (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. запустить поиск.
если не поможет - буду думать дальше.
Lapp
Во-первых, у тебя тело первого цикла (по 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 ).
Танкистка
оо, пасиба большое... щас пойду разбираться)
Танкистка
Цитата


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



я немного не понимаю что такое sp??? почему именно до него.... может кто-нить на примере объяснить...???
ну, мы получаем какое-то число р... ну а зачем мы потом берем от него корень, а потом оставляем целую часть??? почему у нас цикл до этого числа? это разве будет корректная проверка на простоту?? Ааа!!!!... или я ваще чет не поняла.. вот.. Вообщем, кто может помогите...
мисс_граффити
ну смотри.
допустим, у тебя есть число 20. его можно представить так: (идем по порядку):
2*10
4*5
5*4
10*2
как видишь, каждое выражение встречается 2 раза.
значит, нам достаточно изучить только половину. ясное дело, что середина - это корень из 20. один множитель всегда будет больше или равен, а другой меньше или равен.
но корень - не всегда целое число. А граница цикла - обязательно целое... Поэтому нам приходится округлять.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.