Uwierz mi, wierzę Ci, ale na temat tego zadania jest nie tylko ten jeden wątek, są/jest także na starym forum. Typy zmiennych nie są z gumy i nie rozciągają się w nieskończoność jak guma w majtkach [a nie ona też nie w nieskończoność], więc zmaina na unsigned nic tu nie pomoże. Dokładne wartości silni i wiele innych ciekawych rzeczy możesz się dowiedzieć - sprawdzić np tu: http://www.wolframalpha.com/input/?i=21! Jeśli wpiszesz w okienko inną wartość np 33!, to Wolfram obliczy silnię 33. Możesz, też napisać sobie taki jak poniżej lub podobny program i się nim pobawić i porównać wyniki z Wolframem.
int main(){
long long wynik = 1; //możesz potem dodać unsigned
int n = 1000000000;
string c;
cout << "Nie przeszkadzać! Ja tu usiłuję policzyć silnie dla n = 1000000000! ;-)\
\n=======================================================================\n";
cout << wynik << endl;
for (int i = 1; i < n; ++i){
cout << " x " << i << endl;
wynik *= i;
cout << "=" << wynik << " Czy ok? wciśnij Enter lub ctr c";
getline(cin, c);
}
}
U mnie pod linuxem w/w program działa znakomicie. Spróbuj dojechać nim chociaż do 66 a lepiej do 100.
Powodzenia
PS
Gdy bawiąc się moim programikiem, jeżeli u Ciebie zadziała i jeżeli będziesz "jechał" nim powoli, to może uda Ci się zaobserwować ciekawy efekt, tzw "zerwania gumy w majtkach", czyli jakiś tam overflow, czyli przekroczenie zakresu typuzmiennej.