Найти член прогрессии - 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).
- После цикла выводится информация о найденных делителях.
- Если делитель не найден, то процедура заканчивается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д