My preference for run-time speed is:
long Factorial(int input)
{
if (input < 0)
return -1;
if (input < 2)
return 1;
long answer = input;
for( ;input >1; input--)
{
if (long.MaxValue - answer < answer)
throw new ArithmeticException();
answer = input * answer;
}
return answer;
}