Ваши факторные вычисления переполнены. Ваш метод factorial
должен возвращать int
, поскольку вы присвоили возвращаемое значение этого метода для int
.
Начиная с 13
происходит переполнение. 13! 6,227,020,800, первое факториальное значение слишком велико, чтобы быть представленным в int
. Переполнение представляет это значение как 1932053504
. Проблема усугубляется, когда дополнительные значения становятся отрицательными, например, 17! рассчитывается как -288522240
.
В конечном итоге в продукте накапливается достаточное число 2
, чтобы все биты 1
сдвигались с конца, оставляя 0
(начиная с 34!). Это то, что вызвало ваше деление на ноль ошибок.
Но это всего лишь симптом переполнения, которое уже произошло намного раньше. Используйте BigDecimal
для расчета факториала, чтобы избежать переполнения и сохранить точность. Это BigDecimal
может быть передано непосредственно в divide
без преобразования.