Я считаю, что это будет самый быстрый способ, с помощью таблицы поиска:
private static final long[] FACTORIAL_TABLE = initFactorialTable();
private static long[] initFactorialTable() {
final long[] factorialTable = new long[21];
factorialTable[0] = 1;
for (int i=1; i<factorialTable.length; i++)
factorialTable[i] = factorialTable[i-1] * i;
return factorialTable;
}
/**
* Actually, even for {@code long}, it works only until 20 inclusively.
*/
public static long factorial(final int n) {
if ((n < 0) || (n > 20))
throw new OutOfRangeException("n", 0, 20);
return FACTORIAL_TABLE[n];
}
Для нативного типа long
(8 байт) он может содержать до 20!
.
20! = 2432902008176640000(10) = 0x 21C3 677C 82B4 0000
Очевидно, 21!
вызовет переполнение.
Следовательно, для нативного типа long
допустимо, значимо и правильно только максимум 20!
.