Быстрый алгоритм нахождения суммы делителей натурального числа - Free Pascal
Формулировка задачи:
Собственно, тема является идейным продолжением реализации этого алгоритма на С++ (Быстрое нахождение количества делителей натурального числа).
Однако, по какой-то причине данный алгоритм выводит неправильные данные (к примеру, для числа 12 программа даёт в ответе 22, хотя правильно 28).
Есть ли идеи, что тут было скоммунизжено не так? Поскольку на С++ алгоритм вроде работает верно.
Не по теме:
А точнее, наглым образом переписанный на Паскаль алгоритм из этой темы
var
sum : Int64;
i, x, k : integer;
begin
read(x);
if x = 1 then
begin
write(1);
Halt;
end;
sum:= 1;
k:= 1;
while (x and 1) = 0 do
begin
k:= k shl 1;
x:= x shr 1;
end;
k:= (k shl 1) - 1;
if x = 1 then
begin
write(k);
Halt;
end
else sum:= k;
i:= 3;
while (i*i) <= x do
begin
k:= 1;
while x mod i = 0 do
begin
k:= k * i;
x:= x div i;
end;
if k > 1 then sum:= sum * ((k*i - 1) div (i - 1));
i:= i + 2;
end;
if x > 1 then sum:= sum * x + 1;
write(sum);
end.Решение задачи: «Быстрый алгоритм нахождения суммы делителей натурального числа»
textual
Листинг программы
{$mode ObjFPC}
function SumDvsr(a: Int64): Int64;
var i: Longint;
begin
Result:=1; if a=1 then Exit;
while a and 1=0 do begin
Result:=Result shl 1; a:=a shr 1;
end;
Result:=Result shl 1-1;
if a=1 then Exit;
i:=3;
while sqr(i)<=a do begin
Result:=1;
while a mod i=0 do begin
Result:=Result*i; a:=a div i;
end;
if Result>1 then Result:=(Result*i-1) div (i-1);
Inc(i,2);
end;
if a>1 then Result:=Result*(a+1);
end;
begin
WriteLn(SumDvsr(12));
end.