Ciao, si tratta di un problema di overflow, nel senso che il tipo long (che presumo corrisponda ad un intero con segno a 32 bit) non è abbastanza capiente per numeri così grandi come quelli che stai cercando di calcolare.
Giusto per rendere l'idea: il massimo valore esprimibile da un intero a 32 bit è 2.147.483.647, mentre 15! = 1.307.674.368.000.
Nel seguente codice utilizzo interi senza segno a 64 bit, i quali consentono di calcolare al massimo 20!:
#include <iostream>
#include <cstdint>
using namespace std;
uint64_t fattoriale(uint8_t n)
{
uint64_t f = 1;
for(; n > 1; f *= n--);
return f;
}
int main()
{
int n;
cout << "--> ";
cin >> n;
cout << "f(" << n << ") = " << fattoriale(n);
}