der code ist absolut richtig. wahrscheinlich castest du irgendwo zu int, das geht natürlich nicht weil 13! so gross ist das es in int nicht mehr reinpasst.
Der Datentyp unsigned long long ist i.d.R. 64 Bit lang und da unsigned kann er Werte bis maximal 2^64 - 1 = 18446744073709551615 darstellen
Es gilt:
factorial(20) < 2^64 - 1 < factorial(21)
Kurz gesagt heißt das, dass du mit dem Datentyp unsigned long long nur Fakultäten bis einschließlich 20! darstellen kannst, alles weitere würde einen Überlauf ergeben und damit nicht mehr den richtigen Wert.
@Blackbeach: Code sollte soweit korrekt sein, liegt dann wohl daran, dass die Zahlen zu groß werden..
Ab welcher Fakultät fängt das Programm denn an, falsche Ergebnisse auszuspucken?