Я перевел ваш код Python на Паскаль.Я использовал Delphi, но он должен компилироваться и во FreePascal.Возвращается мгновенно:
type
TIntArray = array of Integer; // Delphi: TArray<Integer>;
function findLowestFactor(num: Int64; factors: TIntArray): Integer;
var
start: Integer;
i: Int64;
begin
if Length(factors) > 0 then
start := factors[High(factors)] // factors[-1] in Python, i.e. last entry.
else
start := 2;
i := start;
while i < num do // Int64 can not be used as index in for-loop...
begin // ... so I use while loop.
if num mod i = 0 then // Python: if num % i == 0:
Exit(i); // return i
Inc(i);
end;
Exit(0);
end;
procedure findPrimeFactors(num: Int64; var factors: TIntArray);
var
factor: Integer;
begin
factor := findLowestFactor(num, factors);
if factor > 0 then
begin
// Delphi: factors := factors + [factor];
SetLength(factors, Length(factors) + 1);
factors[High(factors)] := factor;
findPrimeFactors(num div factor, factors);
end
else
begin
// Delphi: factors := factors + [Integer(num)];
SetLength(factors, Length(factors) + 1);
factors[High(factors)] := Integer(num);
end;
end;
const
testValue: Int64 = 600851475143;
var
factors: TIntArray;
i: Integer;
result: Int64;
begin
// Instead of user input, I use the testValue above.
Writeln('test value: ', testValue);
findPrimeFactors(testValue, factors);
result := 1;
for i in factors do
begin
Write(i:8);
result := result * i;
end;
Writeln;
Writeln('multiplied: ', result);
Readln;
end.
Обратите внимание, что мне приходилось использовать Int64 в некоторых местах .Я предполагаю, что Python делает это автоматически, но не Pascal.Возможно, использование целых чисел в некоторых местах делало ваш код таким медленным.
Я пропустил части кода, вводимые пользователем (Readln и т. Д.), Просто использовал заданное вами постоянное значение.Но, как я уже сказал, он возвращается мгновенно с правильными значениями (см. Переменный результат).