//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //Faktoryzacja 32-bitowych liczb typu uint: od 2^31-1 do 2^31-10001 import std.math; //sqrt import std.c.windows.windows; //GetTickCount import std.stdio; //writefln //--------------------------------------------------------------------------- void faktor(uint liczba) { if (liczba <= 1) {writef("1"); return;} uint w; uint pierw = cast(uint)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 / 2; //(tu w bedzie < liczba) if (w * 2 == liczba) {++j; liczba = w;} //gdy liczba dzieli sie przez 2 } while (liczba == w && liczba > 1); //poki sie dzieli przez i if (j > 0) //ma dzielnik 2 {writef("2"); //liczba pierwsza if (j > 1) writef("^", j); //potega if (liczba > 1) writef(" * "); else return; //np. dla 16 } //---Teraz sprawdzam tylko dzielniki nieparzyste uint i; for (i=3; i <= pierw; i+=2) { 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 > 1); //poki sie dzieli przez i if (j > 0) {writef(i); //liczba pierwsza _ui64toa if (j > 1) writef("^", j); //potega if (liczba > 1) writef(" * "); else break; //np. dla 16 } } if (liczba > 1) writef(liczba); //tu najwiekszy podzielnik > sqrt(liczba) } //=========================================================================== int main(char[][] args) { uint L = 4294967295uL; int i; int czas; czas = GetTickCount(); for (i=0; i<10000; ++i) {writef("\n", L, " = "); faktor(L); --L;} czas = GetTickCount() - czas; writef("\nDigitalMars D v0.162: Czas=%d", czas); //--- getchar(); return 0; }