//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //Faktoryzacja 32-bitowych liczb typu Longword: od 2^31-1 do 2^31-10001 program Project1; {$APPTYPE CONSOLE} uses SysUtils, windows, Math; //--------------------------------------------------------------------------- Procedure faktor(liczba: Longword); var w: Longword; j: Integer; //ile razy liczba dzieli się przez i i, pierw: Longword; x : Double; 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; i := i + 2; end; If liczba > 1 Then write(liczba); //tu największy podzielnik > sqrt(liczba); n[. z 35: 5,7 end; //=========================================================================== var L: Longword; i: Integer; czas: Cardinal; begin L := 4294967295; czas := gettickcount; For i:=1 To 10000 Do begin writeln; write(L,' = '); faktor(L); Dec(L); end; czas := gettickcount - czas; writeln; writeln('Delphi 7: Czas=', czas); readln; end.