Помогите, пожалуйста. Как ускорить ПАСКАЛЬ, чтоб он сразу находил все необходимые числа?
Вот код:
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.
Для проверки числа на простоту достаточно проверить делители от 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.
$"петюня" -.
Спасибо! Это задание ЕГЭ. Там таких заданий очень много с разными условиями. Не могли бы Вы объяснить Ваш первый абзац, а точнее второе предложение (Откуда можно узнать про эти степени?)
Алгоритм дубовый. Достаточно проверить все делители до корня из числа и, если на такой делитель делится нацело, взять и сам делитель, и частное. Можно ускорить алгоритм и дальше, см, например,
https://ru.wikipedia.org/wiki/Перебор_делителей
А уж если исходить из условия (sum=3), то проверять вообще почти нечего. Программирование вообще в основном - нахождение толковых алгоритмов, а вовсе не кодирование.
https://ru.wikipedia.org/wiki/Перебор_делителей
А уж если исходить из условия (sum=3), то проверять вообще почти нечего. Программирование вообще в основном - нахождение толковых алгоритмов, а вовсе не кодирование.
проблема не в паскале, а в алгоритме. ясно, что сто миллионов в квадрате операций - это небыстро. факторизация чисел - вообще нетривиальная задача с вычислительной точки зрения. на этом, собственно, и держится современная криптография. погугли "алгоритмы разложения чисел на множители"
из любопытства искал простые
7.98999890685081E-0001 секунд
primes 2 to 100000000 последний 99999989
5761458 штук
delphi
7.98999890685081E-0001 секунд
primes 2 to 100000000 последний 99999989
5761458 штук
delphi
С большими все плохо, потому что вложенный цикл пропорционален числу.
А что вообще считаем то?
А что вообще считаем то?
Похожие вопросы
- Нужна программа на паскале, вычисляющая дополнительный код отрицательного числа
- Паскаль. Цикл While. Определить остаток от деления большего числа а на меньшее число b, не используя стандартные функции
- помогите решить задачи на паскале 1Во входном файле дана последовательность чисел. Требуется найти второе по величине чи
- программирование pascal (паскаль) алгоритм с перестановкой цифр в числе
- Помогите в паскале, дроби нужен код, денег нету, если есть нормальные люди а не транжиры помогите аааа)
- ПОМОГИТЕ! В паскале заполнить квадратный массив размерностью n числами 1,2,3… по спирали от края к центру по часовой стр
- Требуется калькулятор для очень больших чисел, очень больших. Есть такой?
- Как сделать игровой автомат в Паскале? Требуется чтобы выводились 3 случайных числа от 0 до 9
- C++ long double большие числа при умножении искажаются
- Delphi Как сложить два очень больших числа?