предполагая, что вы хотите иметь дело с действительно большими числами, я написал бы это следующим образом. Эта реализация была бы полезна, если бы вы хотели приличную скорость для обычных случаев (низкие числа), но хотели бы иметь возможность обрабатывать некоторые очень сложные вычисления. Я бы посчитал это наиболее полным ответом в теории. На практике я сомневаюсь, что вам нужно будет вычислять такие большие факториалы для чего-либо, кроме домашней задачи
#define int MAX_PRECALCFACTORIAL = 13;
public double factorial(int n) {
ASSERT(n>0);
int[MAX_PRECALCFACTORIAL] fact = {1, 1, 2, 6, 24, 120, 720, 5040, 40320,
362880, 3628800, 39916800, 479001600};
if(n < MAX_PRECALCFACTORIAL)
return (double)fact[n];
//else we are at least n big
double total = (float)fact[MAX_PRECALCFACTORIAL-1]
for(int i = MAX_PRECALCFACTORIAL; i <= n; i++)
{
total *= (double)i; //cost of incrimenting a double often equal or more than casting
}
return total;
}