Другие языки программирования и технологии

Паскаль ДОЛГО считывает КОД с большими числами

Помогите, пожалуйста. Как ускорить ПАСКАЛЬ, чтоб он сразу находил все необходимые числа?
Вот код:

var i,x,sum:longint;
begin
for i:=289123456 to 389123456 do
begin
sum:=0;
for x:=2 to i-1 do
if (i mod x = 0) then
sum:=sum+1;
if (sum=3) then
writeln('Кол-во:',sum,' Само число:',i);
end;
end.

С МАЛЕНЬКИМИ ЧИСЛАМИ ВСЁ ХОРОШО
Судя по коду, ты ищешь числа имеющие ровно 3 делителя, отличных от 1 и самого числа. Но такие числа - ТОЛЬКО четвёртые степени простых чисел.
Для проверки числа на простоту достаточно проверить делители от 2 до квадратного корня этого числа. Т. е. до корня восьмой степени исходного числа.

Таким образом, тебе надо проверить:

1. sqr(sqr(round(sqrt(sqrt(i))))) = i - если условие ложно, число не подходит.

2. Если число прошло первый критерий, проверяем, что число НЕ имеет делителей в диапазоне: 2..round(sqrt(sqrt(sqrt(i)))))

В лоб, минимально меняя твой код (можно ещё быстрее, но код усложнится):

var i,x,sum:longint;
begin
for i := 289123456 to 389123456 do
if sqr(sqr(round(sqrt(sqrt(i))))) = i then begin
sum := 0;
for x := 2 to round(sqrt(sqrt(sqrt(i)))) do if i mod x = 0 then inc(sum);
if sum = 0 then writeln('Кол-во: 3 Само число:', i)
end
end.
РТ
Руслан Тленшин
97 227
Лучший ответ
$"петюня" &#45. Спасибо! Это задание ЕГЭ. Там таких заданий очень много с разными условиями. Не могли бы Вы объяснить Ваш первый абзац, а точнее второе предложение (Откуда можно узнать про эти степени?)
Алгоритм дубовый. Достаточно проверить все делители до корня из числа и, если на такой делитель делится нацело, взять и сам делитель, и частное. Можно ускорить алгоритм и дальше, см, например,
https://ru.wikipedia.org/wiki/Перебор_делителей
А уж если исходить из условия (sum=3), то проверять вообще почти нечего. Программирование вообще в основном - нахождение толковых алгоритмов, а вовсе не кодирование.
ЖЖ
Жорик Жорик
67 362
проблема не в паскале, а в алгоритме. ясно, что сто миллионов в квадрате операций - это небыстро. факторизация чисел - вообще нетривиальная задача с вычислительной точки зрения. на этом, собственно, и держится современная криптография. погугли "алгоритмы разложения чисел на множители"
Artur Hakobian
Artur Hakobian
98 944
из любопытства искал простые
7.98999890685081E-0001 секунд
primes 2 to 100000000 последний 99999989
5761458 штук
delphi
С большими все плохо, потому что вложенный цикл пропорционален числу.
А что вообще считаем то?
BA
Berik Aitleuov
25 516

Похожие вопросы