if you are interested in only an approximate value, you could use a type like double for computing the result. for example, a long double can hold very large values, but precision is limited (on my compiler, the mantissa is accurate upto 15 decimal digits).
#include <limits>
#include <iostream>
#include <iomanip>
using namespace std;
inline long double factorial( unsigned int n )
{
long double result = 1.0 ;
while( n>1 ) result *= n-- ;
return result ;
}
int main()
{
cout << "unsigned int-\t" << numeric_limits< unsigned int >::max() << '\t'
<< numeric_limits< unsigned int >::digits10 << " decimal digits\n" ;
cout << "long double-\t" << numeric_limits< long double >::max() << '\t'
<< numeric_limits< long double >::digits10 << " decimal digits\n" ; ;
cout << fixed << setprecision(0) << "53! ~= " << factorial(53) << '\n' ;
}
/**
>g++ -Wall -std=c++98 num_limits.cpp && ./a.out
unsigned int- 4294967295 9 decimal digits
long double- 1.18973e+4932 15 decimal digits
53! ~= 4274883284060023952295713899453537359909467862005827442747675726839808
*/
for accurate results, you could use a library eg. https://sourceforge.net/projects/cpp-bigint/