Найти член прогрессии - Free Pascal
Формулировка задачи:
Первый член арифметической прогрессии равен А, шаг равен тоже А. Интересует порядковый номер первого числа в данной последовательности, которое является кубом некоторого натурального числа.
Составил код. Как можно упростить программу, чтобы быстрее работала.
А (целое число) (1 ≤ А ≤ 10^9)
var
x3: real;
n,a,a1: longint;
f1,f2:text;
begin
assign(f1, 'interesting.in');
assign(f2, 'interesting.out');
reset(f1);
rewrite(f2);
read(f1,a1);
a:=a1;
n:=1;
x3:=exp(ln(a)/3);
while frac(x3)>0 do
begin
a:=a1+a;
x3:=exp(ln(a)/3);
n:=n+1;
end;
writeln(f2,n);
close(f1);
close(f2);
end.Решение задачи: «Найти член прогрессии»
textual
Листинг программы
procedure Factorization(A: TType; var DivizorsCount: integer; var Divizors: TList); var X, Step: TType; r, q: TType; begin X := 2; Step := 2; DivizorsCount := 0; while A <> 1 do begin r := A mod X; q := A div X; if r = 0 then begin Inc(DivizorsCount); Divizors[DivizorsCount].Divizor := X; Divizors[DivizorsCount].Count := 0; while A mod X = 0 do begin Inc(Divizors[DivizorsCount].Count); A := A div X; end; writeln(DivizorsCount: 3, Divizors[DivizorsCount].Divizor: 10, Divizors[DivizorsCount].Count: 10); end else begin if q <= X then begin Inc(DivizorsCount); Divizors[DivizorsCount].Divizor := A; Divizors[DivizorsCount].Count := 1; A := 1; end; end; case X of 2: X := 3; 3: X := 5; else begin X := X + Step; Step := Step xor $6; end end; end; end;
Объяснение кода листинга программы
В данном коде реализована процедура нахождения факторизации числа.
- Объявлены переменные: — A — входное число; — DivizorsCount — счётчик количества найденных делителей; — Divizors — список для хранения найденных делителей; — X, Step — переменные для хранения текущего и следующего тестового числа; — r, q — переменные для хранения частного и остатка от деления A на X; — TType — тип данных, который предполагается использовать для хранения чисел.
- Инициализированы переменные: — X, Step — инициализируются начальными значениями; — DivizorsCount — инициализируется начальным значением; — Divizors — инициализируется массивом; — A — предполагается, что инициализируется до вызова процедуры.
- Запускается цикл, который выполняется до тех пор, пока A не станет равным 1. В каждой итерации: — Вычисляются r и q. — Если r равно 0, то это значит, что X является делителем A, поэтому: — Увеличивается счётчик делителей; — X записывается в массив делителей; — Делитель X присваивается переменной A; — Увеличивается счётчик для делителя X; — Цикл выполняется до тех пор, пока A не станет равным X. — Выводится информация о найденном делителе. — Если r не равно 0, то: — Если q меньше или равно X, то: — Увеличивается счётчик делителей; — X записывается в массив делителей; — A присваивается единице, чтобы не искать его делители повторно; — Цикл прерывается. — Иначе: — X увеличивается на Step; — Step меняется на обратное значение Step (XOR $6).
- После цикла выводится информация о найденных делителях.
- Если делитель не найден, то процедура заканчивается.