Почему неверно рассчитывается факториал?

Всем привет. Я написал функцию для расчета факториала. И все вроде ок, но потом проверил и выходит что после 12! результат неверный. Проверял в Гуле, и на сторонних сайтах.

Код

fun factorial(num: Int): Int {
    if( num!=1 ) {
        return num * factorial(num-1);
    } else return 1
}

В чем проблема? Сам код вроде правильный.


Ответы (2 шт):

Автор решения: Harry

13!=6227020800

А это число в 32-битное уже не помещается никак...

→ Ссылка
Автор решения: Fox Code

Правильно сказал коллега выше - 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.

На этом сайте кстати нашел пример расчета факториала с помощью корутин. Может полезно будет, почитайте. Мне кажется с корутинами скорость будет выше.

→ Ссылка