Да. Давайте назовем ваш вход х. Для небольших значений x, вы можете просто попробовать все значения n и посмотреть, если n! = х. Для большего x вы можете выполнить бинарный поиск по n, чтобы найти правильное n (если оно существует). Обратите внимание, что у нас есть n! ≈ e ^ (n ln n - n) (это приближение Стирлинга ), поэтому вы примерно знаете, где искать.
Проблема, конечно, в том, что очень немногие числа являются факториалами; поэтому ваш вопрос имеет смысл только для небольшого набора входных данных. Если ваш ввод небольшой (например, помещается в 32-разрядное или 64-разрядное целое число), лучшим вариантом будет таблица поиска.
(Вы, конечно, могли бы рассмотреть более общую проблему инвертирования гамма-функции . Опять же, бинарный поиск, вероятно, был бы лучшим способом, а не чем-то аналитическим. Я был бы рад, если бы меня неправильно показали здесь.)
Редактировать : На самом деле, в случае, когда вы не знаете наверняка, что x является факториальным числом, вы не можете получить слишком много (или что-нибудь) с помощью двоичного поиска, используя приближение Стирлинга или Гамма-функция, над простыми решениями. Обратный факториал растет медленнее, чем логарифмический (это потому, что факториал является суперэкспоненциальным), и вам нужно выполнить арифметику произвольной точности, чтобы найти факториалы и все равно умножить эти числа.
Например, см. Ответ Драко Атера об идее, что (при расширении на арифметику произвольной точности) будет работать для всех х. Ответ Дэва, который является наиболее естественным алгоритмом, - еще проще, и, вероятно, даже быстрее, потому что умножение происходит быстрее, чем деление. Похоже, эта проблема - еще один триумф простоты. : -)