//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //faktoryzacja liczb int64 program Project1; {$APPTYPE CONSOLE} uses SysUtils, windows, Math; //--------------------------------------------------------------------------- Procedure faktor(liczba: Int64); var j: Integer; //ile razy liczba dzieli się przez i w, i, pierw: Int64; x : Extended; begin If liczba <= 1 Then begin write('1'); exit; end; //Oblicz pierwiastek z liczba x := liczba; pierw := Floor(Sqrt(x)); //---Najpierw sprawdzam dzielnik 2 j := 0; repeat //dziel liczbę przez 2 tyle razy ile się da begin w := liczba div 2; //(tu w będzie < liczba) If w * 2 = liczba Then begin Inc(j); liczba := w; end; //gdy liczba dzieli się przez 2 end; until (liczba <> w) or (liczba <= 1); //póki się dzieli przez i If j > 0 Then //ma dzielnik 2 begin write('2'); //liczba pierwsza If j > 1 Then write('^',j); //potęga If liczba > 1 Then write(' * ') else exit; //np. dla 16 end; //---Teraz sprawdzam tylko dzielniki nieparzyste i := 3; while i <= pierw do begin j := 0; //ile razy liczba dzieli się przez i repeat //dziel liczbę przez i tyle razy ile się da begin w := liczba div i; //(tu w będzie < liczba) if w * i = liczba Then begin Inc(j); liczba := w; end; //gdy liczba dzieli się przez i end until (liczba <> w) or (liczba <= 1); //póki się dzieli przez i If j > 0 Then begin write(i); //liczba pierwsza If j > 1 Then write('^', j); //potęga If liczba > 1 Then write(' * ') else break; //np. dla 16 end; Inc(i, 2); end; If liczba > 1 Then write(liczba); //tu największy podzielnik > sqrt(liczba) end; //=========================================================================== var czas: Cardinal; L: Int64; begin L := 520910528025684480; writeln('L=', L); czas := GetTickCount; faktor(L); czas := GetTickCount - czas; writeln; writeln('Delphi 7: Czas=', czas); readln; end.