//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //Faktoryzacja 32-bitowych liczb typu unsigned int: od 2^31-1 do 2^31-10001 #include "stdafx.h" #include //sqrt #include //GetTickCount() //--------------------------------------------------------------------------- inline void faktor(unsigned int liczba) //szybsze (zwłaszcza dla liczb mających mało podzielników) { if (liczba <= 1) {printf("1"); return;} unsigned int w, pierw = (unsigned int)sqrt((double)liczba); int j = 0; //ile razy liczba dzieli się przez i //---Najpierw sprawdzam dzielnik 2 do //dziel liczbę przez 2 tyle razy ile się da {w = liczba / 2; //(tu w będzie < liczba) if (w * 2 == liczba) {++j; liczba = w;} //gdy liczba dzieli się przez 2 } while (liczba == w && liczba > 1); //póki się dzieli przez i if (j > 0) //ma dzielnik 2 {printf("2"); //liczba pierwsza if (j > 1) printf("^%d", j); //potęga if (liczba > 1) printf(" * "); else return; //np. dla 16 } //---------------------------------------------- //---Teraz sprawdzam tylko dzielniki nieparzyste unsigned int i; for (i=3; i <= pierw; i+=2) {j = 0; //ile razy liczba dzieli się przez i do //dziel liczbę przez i tyle razy ile się da {w = liczba / i; //(tu w będzie < liczba) if (w * i == liczba) {++j; liczba = w;} //gdy liczba dzieli się przez i } while (liczba == w && liczba > 1); //póki się dzieli przez i if (j > 0) {printf("%u",i); //liczba pierwsza if (j > 1) printf("^%d", j); //potęga if (liczba > 1) printf(" * "); else break; //np. dla 16 } } if (liczba > 1) printf("%u", liczba); //tu największy podzielnik > sqrt(liczba) } //=========================================================================== int main(int, char*[]) { int i, czas; unsigned int L = 4294967295; czas = GetTickCount(); for (i=0; i<10000; ++i) {printf("\n%u = ", L); faktor(L); --L;} czas = GetTickCount() - czas; printf("\nVisual C++ 6.0: Czas=%d", czas); //--- getchar(); return 0; }