Вычисление факториала натуральных (неотрицательных целых) чисел с помощью пользовательской функции Factorial. Ограничение для VBA Excel по типу данных.
Факториал и его вычисление
Формула, по которой вычисляется факториал, записывается следующим образом:
n! = 1 · 2 · ... · n
Пример: 3! = 1 · 2 · 3 = 6
В соответствии с формулой факториала, будет верным следующее соотношение:
(n-1)! = n! : n
Если принять для этого равенства n = 1, тогда получим:
0! = 1
Пользовательская функция Factorial
Для вычисления факториала натуральных чисел можно использовать следующую пользовательскую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Public Function Factorial(n) Dim i, p If Not IsNumeric(n) Or n = Empty Then Factorial = "Аргумент не является числом" Exit Function ElseIf n < 0 Then Factorial = "Аргумент отрицательный" Exit Function End If p = 1 n = Format(n, 0) If n > 1 Then For i = 2 To n p = p * i Next End If Factorial = p End Function |
Первое условие функции Factorial (If Not IsNumeric(n) Or n = Empty
) проверяет, не является ли значение ячейки не числом. Второе условие (ElseIf n < 0
) проверяет, не является ли число в ячейке отрицательным.
Если значение ячейки окажется не числом или числом отрицательным, функция возвратит соответствующее сообщение и завершит работу (Exit Function
).
Далее, если функция Factorial не завершила работу, переменной p присваивается значение 1, которое возвратит функция, если значение переменной n будет равно нулю или единице.
Значение ячейки (переменная n) округляется до целого и, если оно окажется больше единицы, вычисляется факториал с помощью цикла For… Next.
Пользовательская функция Factorial возвратит значение, присвоенное ей из переменной p.
Рекурсивная функция Factorial
Рекурсивная функция, вычисляющая факториал:
1 2 3 4 5 6 7 |
Function Factorial(n) If n <= 1 Then Factorial = 1 Else Factorial = Factorial(n - 1) * n End If End Function |
Как она работает, я не понимаю, но она работает!
Ограничение по типу данных
Максимальное значение пользовательской функции Factorial для ячеек с общим форматированием будет ограничено максимальным значением типа данных Double (1,79769313486232Е+308).
Максимально возможное значение будет превышено при вычислении факториала при n > 170. В этом случае, в ячейку с функцией Factorial, Excel возвратит сообщение об ошибке: #ЗНАЧ!.
При желании, можно в код функции Factorial добавить еще одно условие, проверяющее, не содержит ли переменная n значение больше 170. Если n > 170, тогда вывод сообщения об этом и выход из функции.
Попробуйте задать ячейке с функцией Factorial числовой тип без дробных значений. У меня в Excel 2016 x64 факториал от 146 отображается из 15 значащих цифр впереди и огромного количества нулей справа. Чтобы это увидеть, надо ячейку растянуть на всю ширину и уменьшить размер шрифта в ней. Значение факториала от 147 в ячейке с числовым форматом уже не отображается.