Почему неверно рассчитывается факториал?
Всем привет. Я написал функцию для расчета факториала. И все вроде ок, но потом проверил и выходит что после 12! результат неверный. Проверял в Гуле, и на сторонних сайтах.
Код
fun factorial(num: Int): Int {
if( num!=1 ) {
return num * factorial(num-1);
} else return 1
}
В чем проблема? Сам код вроде правильный.
Ответы (2 шт):
Правильно сказал коллега выше - Int слишком мелкое для таких расчетов. Для этих целей пригодится BigInteger. Вот пример кода
fun calculateFactorial(num: Int): BigInteger {
var n = BigInteger.ONE
for (i in 1..num) {
n = n.multiply(BigInteger.valueOf(i.toLong()))
}
return n
}
В коде выше мы объявляем переменную n с типом BigInteger. ONE - константа равная 1. То же самое можно получить и так
var n = BigInteger.valueOf(1)
но с ONE просто короче и красивее. Далее в цикле мы рассчитываем n вызвав метод multiply у BigInteger, который умножает n на параметр, передаваемый в multiply.
На этом сайте кстати нашел пример расчета факториала с помощью корутин. Может полезно будет, почитайте. Мне кажется с корутинами скорость будет выше.