Помогите, в одном тесте пишет: "Превышено максимальное время". Задача: Вывести все...

0 голосов
84 просмотров

Помогите, в одном тесте пишет: "Превышено максимальное время".

Задача:
Вывести все простые числа от M до N включительно.

Входные данные
В первой строке находятся разделённые пробелом M и N. 2 <= M <= N <= 1 000 000.<br>
Выходные данные
Вывести числа в порядке возрастания, по одному в строке. Если между M и N включительно нет простых - вывести "Absent".

Сам код:
var i,a,b,c,n,d: longint;
begin
Read(a, n);
For i:=a to n do
begin
For b:=2 to trunc(sqrt(i)) do
If i mod b=0 then c:=c+1;
If c=0 then
begin
writeln(i);
d:=d+1;
end
else
c:=0;
end;
if d=0 then writeln('Absent');
end.


Информатика (194 баллов) | 84 просмотров
Дан 1 ответ
0 голосов

//Прости, но я не понимаю что должен делать код выше, напишу свой.
//Pascal ABC. NET v3.0
var m,n:real;
i:integer;
begin
Read(m,n);
if abs(m-n)<1 then<br> begin;
  write('Absent');
  exit;
 end;
for i:=trunc(m)+1 to trunc(n) do
writeln(i);
end.

(1.7k баллов)
0

Лишние команды при поиске простых чисел. Как только нашли число, на которое делится без остатка, из цикла надо выходить.  Нужно заменить строки  If i mod b=0 then c:=c+1;  нужно заменить на следующие  If i mod b=0 then begin c:=c+1; break;  end;  На порядок уменьшится время проверки числа, простое оно или нет.

0

Ах, не натуральные, а простые. Если бы мне дали возможность подредактировать...

0

var m,n:real;
i,j:integer;
b,bc:boolean;
begin
b:=false;
bc:=false;
Read(m,n);
for i:=trunc(m)+1 to trunc(n) do
 begin;
  for j:=2 to trunc(sqrt(i)) do
   If i mod j=0 then
    begin;
     b:=true;
     break;
     end;
  if b=false then
   begin;
    writeln(i);
     bc:=true;
   end
    else
    b:=false;
  end;
if bc=false then writeln('Absent');  
end.

0

Спасибо большое, все получилось с break