//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //faktoryzacja liczb int64 import std.math; //sqrt import std.c.windows.windows; //GetTickCount import std.stdint; //int64_t import std.stdio; //writefln //--------------------------------------------------------------------------- char gBufor[64]; //--------------------------------------------------------------------------- void faktor(int64_t liczba) { if (liczba <= 1L) {writef("1"); return;} int64_t w, pierw = cast(int64_t)sqrt(cast(double)liczba); //writefln("pierw=",pierw); int j = 0; //ile razy liczba dzieli sie przez i //---Najpierw sprawdzam dzielnik 2 do //dziel liczbe przez 2 tyle razy ile sie da {w = liczba / 2L; //(tu w bedzie < liczba) if (w * 2L == liczba) {++j; liczba = w;} //gdy liczba dzieli sie przez 2 } while (liczba == w && liczba > 1L); //poki sie dzieli przez i if (j > 0) //ma dzielnik 2 {writef("2"); //liczba pierwsza if (j > 1) writef("^", j); //potega if (liczba > 1L) writef(" * "); else return; //np. dla 16 } //---Teraz sprawdzam tylko dzielniki nieparzyste int64_t i; for (i=3L; i <= pierw; i+=2L) { j = 0; //ile razy liczba dzieli sie przez i do //dziel liczbe przez i tyle razy ile sie da {w = liczba / i; //(tu w bedzie < liczba) if (w * i == liczba) {++j; liczba = w;} //gdy liczba dzieli sie przez i } while (liczba == w && liczba > 1L); //poki sie dzieli przez i if (j > 0) {writef(i); //liczba pierwsza _ui64toa if (j > 1) writef("^", j); //potega if (liczba > 1L) writef(" * "); else break; //np. dla 16 } } if (liczba > 1L) writef(liczba); //tu najwiekszy podzielnik > sqrt(liczba) } //=========================================================================== int main(char[][] args) { int64_t L = 520910528025684480L; writefln("L=", L); int czas; czas = GetTickCount(); faktor(L); czas = GetTickCount() - czas; writef("\nDigitalMars D v1.015: Czas=%d", czas); //--- getchar(); return 0; }