Я пока не нашел. Я что-то пропустил? Я знаю, что факторный метод - это распространенный пример программы для начинающих. Но разве не было бы полезно иметь для этого стандартную реализацию для повторного использования? Я мог бы использовать такой метод со стандартными типами (например, int, long ...), а также с BigInteger / BigDecimal.
105
В Apache Commons Math есть несколько факториальных методов в классе MathUtils .
источник
Версия Big Numbers от HoldOffHunger :
источник
На практике голые факториалы нужны редко. Чаще всего вам понадобится одно из следующего:
1) разделить один факториал на другой, или
2) приближенный ответ с плавающей запятой.
В обоих случаях вам лучше использовать простые индивидуальные решения.
В случае (1), скажем, если x = 90! / 85 !, то вы рассчитаете результат как x = 86 * 87 * 88 * 89 * 90, без необходимости удерживать 90! в памяти :)
В случае (2) введите в Google "приближение Стирлинга".
источник
Используйте Guava
BigIntegerMath
следующим образом:(Аналогичные функции для
int
иlong
доступны вIntMath
иLongMath
соответственно.)источник
Хотя факториалы - хорошее упражнение для начинающего программиста, в большинстве случаев они не очень полезны , и каждый знает, как написать факториальную функцию, поэтому обычно их нет в средней библиотеке.
источник
Я считаю, что это был бы самый быстрый способ с помощью таблицы поиска:
Для собственного типа
long
(8 байт) он может содержать не более20!
Очевидно, что
21!
вызовет переполнение.Следовательно, для собственного типа разрешено, имеет смысл и правильный
long
максимум20!
.источник
Поскольку факториал растет так быстро, переполнение стека не является проблемой, если вы используете рекурсию. На самом деле значение 20! является самым большим из возможных в Java long. Таким образом, следующий метод либо вычислит factorial (n), либо выдаст исключение IllegalArgumentException, если n слишком велико.
Другой (более крутой) способ сделать то же самое - использовать потоковую библиотеку Java 8 следующим образом:
Подробнее о факториалах с использованием потоков Java 8
источник
В пакете Apache Commons Math есть факторный метод , я думаю, вы могли бы его использовать.
источник
Короткий ответ: используйте рекурсию.
Вы можете создать один метод и рекурсивно вызвать его прямо внутри того же метода:
источник
System.out.println(calc(10));
чтобыSystem.out.println(calc(Long.MAX_VALUE));
получить довольно длинную трассу :)BigInteger
. Я попытался вычислить факториал числа,8020
которое дало мне результат613578884952214809325384...
с27831
десятичными знаками. Так что даже при работе с числами это огромное «нет»Stackoverflow
будет выброшено. Конечно, вы правы, но я сомневаюсь, что есть такие большие числа, которые можно использовать на практике :-)Попробуй это
источник
i <= value
. Цикл for можно немного оптимизировать до(int i = 2; i <= value; i++)
.Я нашел удивительный трюк, чтобы найти факториалы всего лишь за половину действительного умножения.
Пожалуйста, проявите терпение, так как это довольно длинный пост.
Для четных чисел: чтобы уменьшить умножение на четные числа вдвое, вы получите n / 2 множителя. Первым фактором будет число, от которого вы берете факториал, затем следующим будет это число плюс это число минус два. Следующим числом будет предыдущее число плюс последнее добавленное число минус два. Вы закончили, когда последним добавленным числом было два (т.е. 2) . Вероятно, в этом не было особого смысла, поэтому позвольте мне привести вам пример.
Обратите внимание, что я начал с 8, затем первое число, которое я добавил, было 6, затем 4, затем 2, каждое добавленное число было на два меньше, чем число, добавленное перед ним. Этот метод эквивалентен умножению наименьших чисел на наибольшие числа, только с меньшим умножением, например:
Все просто :)
Теперь для нечетных чисел: если число нечетное, сложение такое же, как если бы вы каждый раз вычитали два, но вы останавливаетесь на трех. Однако количество факторов меняется. Если разделить число на два, получится число, оканчивающееся на 0,5. Причина в том, что если мы умножим концы вместе, у нас останется среднее число. По сути, все это может быть решено путем решения ряда факторов, равных числу, деленному на два, с округлением в большую сторону. Вероятно, это тоже не имело большого смысла для умов без математического образования, поэтому позвольте мне привести пример:
Примечание. Если вам не нравится этот метод, вы также можете просто взять факториал четного числа перед нечетным (в данном случае восемь) и умножить его на нечетное число (т.е. 9! = 8! * 9).
Теперь реализуем это на Java:
isFirst
это логическая переменная, объявленная статической; он используется для первого случая, когда мы не хотим изменять предыдущую сумму.Попробуйте как с четными, так и с нечетными числами.
источник
Вы можете использовать рекурсию.
а затем после создания метода (функции) выше:
источник
Единственное коммерческое использование факториала, которое я могу придумать, - это формулы Erlang B и Erlang C, и не все работают в колл-центре или в телефонной компании. Кажется, что полезность функции для бизнеса часто диктует то, что отображается на языке - посмотрите на всю обработку данных, XML и веб-функции на основных языках.
Для чего-то вроде этого легко сохранить факториальный сниппет или библиотечную функцию.
источник
Очень простой метод вычисления факториалов:
Я использовал double, потому что они могут содержать большие числа, но вы можете использовать любой другой тип, например int, long, float и т. Д.
PS Это может быть не лучшее решение, но я новичок в кодировании, и мне потребовалось много времени, чтобы найти простой код, который мог бы вычислять факториалы, поэтому мне пришлось написать метод сам, но я помещаю его здесь, чтобы он помог другим людям, таким как я .
источник
Вы также можете использовать версию с рекурсией.
Рекурсия обычно менее эффективна из-за необходимости подталкивать и выталкивать рекурсии, поэтому итерация выполняется быстрее. С другой стороны, рекурсивные версии используют меньше локальных переменных или вообще не используют их, что является преимуществом.
источник
Факториал - это сильно увеличивающаяся дискретная функция, поэтому я думаю, что использование BigInteger лучше, чем использование int. Я реализовал следующий код для вычисления факториала неотрицательных целых чисел. Я использовал рекурсию вместо использования цикла.
Здесь диапазон больших целых чисел
Однако диапазон факториального метода, приведенного выше, можно расширить до двух раз с помощью беззнакового BigInteger.
источник
У нас есть одна строка для его вычисления:
источник
Достаточно простой способ
источник
источник
источник
Нам нужно реализовывать итеративно. Если мы реализуем рекурсивно, это вызовет StackOverflow, если ввод станет очень большим (т.е. 2 миллиарда). И нам нужно использовать несвязанное число размера, такое как BigInteger, чтобы избежать арифматического переполнения, когда факториальное число становится больше, чем максимальное число данного типа (т.е. 2 миллиарда для int). Вы можете использовать int для максимум 14 факториалов и long для максимум 20 факториалов до переполнения.
Если вы не можете использовать BigInteger, добавьте проверку ошибок.
источник
источник
цикл while (для небольших чисел)
источник
Получил от EDX, пользуйся! это называется рекурсией
источник
с рекурсией:
с циклом while:
источник
ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКОГО ПРОГРАММИРОВАНИЯ ЭФФЕКТИВНО
если вы хотите использовать его для вычисления снова и снова (например, кеширование)
Код Java:
источник
использование рекурсии - самый простой метод. если мы хотим найти факториал N, мы должны рассмотреть два случая, когда N = 1 и N> 1, поскольку в факториале мы продолжаем умножать N, N-1, N-2 ,,,,, до 1. если мы перейти к N = 0 мы получим 0 за ответ. чтобы помешать факториалу достичь нуля, используется следующий рекурсивный метод. Внутри функции факториала, пока N> 1, возвращаемое значение умножается на другое инициирование функции факториала. это будет держать код, рекурсивно вызывающий factorial (), пока он не достигнет N = 1. для случая N = 1 он сам вернет N (= 1), и весь ранее созданный результат умноженного возврата N s умножается на N = 1. Таким образом дает факториальный результат.
источник