Как сделать факториал в вба

Добавил пользователь Евгений Кузнецов
Обновлено: 10.09.2024

Можно ли, включив циклические ссылки (выберите enable iterative calculation в Formulas часть Excel Options ), создать рекурсивную факториальную функцию в Excel? Я, конечно, знаю FACT() и не ищу практического способа вычисления факториалов. Скорее, моя цель - найти способ использовать циклические ссылки в качестве общего инструмента для создания и использования рекурсивных функций в Excel, а факториалы представляют собой интересный тестовый пример.

Я создал именованные диапазоны, используя строки в верхнем ряду. В ячейку с именем factorial я ввел:

и в ячейку factor я ввел:

На изображении выше показано, как все выглядит, когда n = 10 и initializing = True . Формула в factorial соответствует стандартному приему в функциональном программировании для создания рекурсивной функции рекурсивный вызов хвоста путем введения вспомогательной функции с параметром накопления. Проблема заключается в том, что требуется вызвать вспомогательную функцию, а формула факториала в некотором смысле является как самой функцией, так и ее вспомогательной функцией с содержанием initializing определяет, какую роль он играет в настоящее время.

То, что у меня есть, работает в том смысле, что если я переключу значение initializing из True (например, просто удалим его), то значение factorial становится правильным факториалом:

Можно ли удалить initializing с картинки? Можно ли изменить настройку так, чтобы, например, если n изменяется на 5, а затем factorial меняется на 120 без необходимости сначала устанавливать, а затем менять какую-то другую ячейку? Я пробовал несколько разных вещей, но продолжаю в конечном итоге с 2-шаговыми, а не 1-шаговыми функциями. Может быть, какое-нибудь волшебство, включающее формулы массива?

Первый параметр . Текст приглашения задается первым параметром. Это может быть строка длиной до тысячи символов. Эта строка может состоять из нескольких физических строк. Для этого в нее следует включить символы возврата каретки и перевода строки — Chr(10) и Chr(13) , соответст-

венно, или предопределенную константу vbCr .

Второй параметр (необязательный) задает текст заголовка окна. Третий параметр (необязательный) задает строку по умолчанию.

Дополнительные параметры . С помощью еще двух необязательных параметров можно указать X- и Y-координаты окна ввода относительно левого верхнего угла экрана.

Например, при помощи следующего кода на экран будет выведено окно ввода, изображенное на рис. П.4.

Dim MySearch As String

InputBox ("Введите фамилию клиента", "Поиск клиента", "Иванов")

If MySearch <> “” Then

Рис. П.4. Окно ввода содержит заготовку строки, которую пользователь может отредактировать или удалить

Если пользователь щелкнет на OK или нажмет клавишу [Enter], то в переменную MySearch будет помещено значение “Иванов”. Если пользователь щелкнет на Отмена или нажмет клавишу [Esc], то функция InputBox вернет пустую строку.

Взаимодействие с операционной системой

Пользователь — не единственный объект внешнего мира, с которым приходится взаимодействовать программе. Иногда макрос может нуждаться в обмене данными с операционной системой. Самое распространенное взаимодействие такого рода — это файловые операции, когда программа читает данные из дискового файла или записывает данные в файл. Возможны также случаи, когда программе необходимо управлять работой другого приложения, причем это может осуществляться не только посредством технологии Automation (в конце концов, далеко не все приложения поддерживают Automation), но и другими способами.

Запуск приложений (функция Shell)

Функция Shell осуществляет асинхронный запуск другого приложения. Асинхронность означает, что функция не ожидает ни какой реакции от запущенной программы и выполнение VBAкода продолжается независимо от результата выполнения этого приложения. Функция возвращает целочисленное ( Double ) значение в формате Variant , соответствующее идентификатору стартовавшего приложения (коду задачи); если программу запустить не удалось, функция Shell возвращает значение 0.

Вот как, например, VBA-код может запустить редактор системных файлов Windows:

286 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Dim MyAppNum As Variant

On Error Resume Next

MyAppNum = Shell ("c:\windows\system\sysedit.exe", 1)

If MyAppNum=0 Then

MsgBox “Запуск программы невозможен”

Как сделать запущенное приложение активным (оператор AppActivate)

Оператор AppActivate делает текущим окно заданного приложения. Чтобы указать требуемое приложение, необходимо использовать его идентификатор (код задачи), возвращенный функцией Shell . Вместо идентификатора можно указать текст титульной строки приложения, которое необходимо сделать текущим.

Вот как, например, можно активизировать приложение с использованием идентификатора (кода задачи), возвращенного функцией Shell :

Dim MyAppNum As Variant

On Error Resume Next

MyAppNum = Shell("c:\windows\system\sysedit.exe", 1)

Пример, активизации приложения с использованием текста из строки заголовка окна приложения:

AppActivate "Редактор файлов настройки", True

При помощи второго параметра (логическое значение True) определяется, что активация приложения осуществляется только после того, как само вызывающее приложение станет активным. По умолчанию этот параметр принимается равным False и активация требуемого приложения происходит немедленно.

Управление другим приложением при помощи имитации ввода с клавиатуры (оператор SendKeys)

VBA-программа может посылать другому приложению “нажатия клавиш”, то есть имитировать ввод с клавиатуры, управляя тем самым работой другой программы.

Поскольку нажатия клавиш с клавиатуры может получать только активное приложение, его окно необходимо вначале сделать текущим при помощи оператора AppActivate — виртуальные нажатия клавиш произойдут в активном окне.

Набор нажатий клавиш задается при помощи параметра-строки, в котором обычные символы

представлены возвращаемым ими символом, а специальные клавиши - своими именами, заключенными в фигурные скобки (например, , , ). Если при “виртуальном” нажатии должна удерживаться одновременно клавиша [Shift], то код клавиши необходимо предварить знаком “+”. Знаки “^” и “%” соответствуют одновременно нажатым клавишам [Ctrl] и [Alt]. Например, сочетание [Alt]+[F4] должно обозначаться символами

Вычисление факториала при помощи калькулятор Windows из VBA-кода

Опишем, каким образом, например, можно использовать калькулятор Windows для вычислений в коде VBA. Предполагается, что калькулятор последний раз был закрыт в режиме работы для

Операторы и встроенные функции языка VBA 287

инженерных вычислений. Допустим, требуется вычислить факториал от числа, содержащегося в

Integer -переменной MyNumber .

Dim MyAppNum As Variant

Dim MyNumber As Integer

On Error Resume Next

MyAppNum = Shell("c:\windows\calc.exe", 1)

SendKeys Str(MyNumber) & "!^c%", True

Вначале функцией Shell запускается исполняемый файл калькулятора calc.exe в каталоге Windows. Затем окно калькулятора делается текущим при помощи оператора AppActivate . Теперь наступает черед SendKeys . Строка, которая задает виртуальный ввод с клавиатуры выглядит следующим образом:

Фактическая строка символов, с учетом преобразования числа 5 в строку “5” и объединения строковых значений:

В окне калькулятора будет “нажата” цифровая клавиша 5, затем будет введен символ “!”, что соответствует вычислению факториала. В окошке калькулятора появится результат (число 120). Символы “^c” соответствуют нажатию [Ctrl]+[c], что влечет за собой копирование результата в буфер. Наконец, символы “%” соответствуют сочетанию [Alt]+[F4], благодаря чему окно калькулятора тут же закрывается. Остается лишь использовать хранящийся в буфере результат, например, вставить его вызовом метода Paste соответствующего объекта.

Если необходимо управлять программой, которая не поддерживает Automation, то имитация ввода с клавиатуры при помощи оператора SendKeys — единственное средство, остающееся в распоряжении VBA-программы.

<- см. также в раздел “Еще одно “страшное” слово — OLE”.

Если не рассматривать исполняемые и системные файлы, физический доступ к которым — прерогатива операционной системы, то все файлы данных на самом деле ничем не отличаются друг от друга — отличается лишь режим, в котором программа открывает конкретный файл и то, каким образом организованы данные в файле. Далее упоминаются, например, “файлы последовательного доступа” и “файлы произвольного доступ”, а также “двоичные файлы” — из этого не следует, что это какие-то специальные разновидности файлов. Любой файл можно открыть в любом из режимов — все зависит от того, что программа собирается с этим файлом делать и под каким как предполагается рассматривать содержащиеся в файле данные.

VBA-программы часто имеют дело с файлами неявным образом, взаимодействуя с Word, Excel, Access или PowerPoint, они одновременно обращаются к файлам данных, принадлежащим этим приложениям. Все подобные операции выполняются автоматически. Здесь речь пойдет о файловых операциях, которые могут потребоваться VBA-программе для каких-то внутренних специальных целей.

Visual Basic для приложений обладает обширным инструментарием для файловых операций. Операторы и функции языка позволяют работать с дисковыми устройствами (приводами), каталогами и собственно файлами. В отношении файлов определен ряд операций (открытие и закрытие,

288 Приложение. VBA, как язык программирования: данные, синтаксис и функции

чтение и запись, позиционирование и др.), однако если речь идет о конкретном файле, многое зависит от его формата и режима доступа, с которым открыт файл.

Какие бывают файлы

Visual Basic (и не только Visual Basic) различает три вида файлов (или, что практически то же самое, три режима доступа к файлу):

Файлы последовательного доступа

Все текстовые (ASCII-, ANSI-файлы) состоят из последовательности строк символов, при этом каждая строка может иметь произвольную длину и доступ к этим строкам может быть только последовательным. Если, например, программе требуется 101-я строка текстового файла, ей придется прочитать вначале первые 100 строк, причем совершенно неизвестно, во что это выльется и есть ли в файле 101-строка, быть может, он состоит из одной огромной строки.

Файлы произвольного доступа

Файл произвольного доступа состоит из записей фиксированной длины, поэтому местоположение записи в файле можно вычислить умножением номера записи на ее длину. Благодаря этому оказывается возможным позиционироваться на произвольную запись. Если программе требуется 101-я запись в файле данных, она может прочитать непосредственно 101-ю запись. Размер файла кратен размеру записи, и по этой причине всегда можно определить, сколько записей содержится в файле по его размеру, даже не открывая его.

Бинарные (двоичные) файлы

Бинарный файл представляет собой частный случай файла произвольного доступа — достаточно принять длину записи равной одному байту и становится возможным позиционироваться на произвольный байт в файле. Что означают все эти байты и как они организованы — дело самой программы.

Операции с каталогами и дисками

Для операций с файлами, каталогами и дисками в VBA существует набор операторов, функционально соответствующий командам операционной системы MS DOS.

Оператор ChDrive делает дисковое устройство текущим (выбирает его). В качестве параметра должна выступать текстовая строка, первым символом которой должна быть литера — имя диска. Например, оператор

сделает текущим диск D . Обратите внимание на тот факт, что вместо строки “D” можно было бы указать, например, “D:\TEMP” с таким же успехом — оператор ChDrive распознает только первую литеру строки.

При помощи оператора MkDir можно создать каталог (подкаталог) с заданным именем. Например, создать в корневом каталоге диска C подкаталог с именем WORK можно при помощи оператора:

Чтобы сменить текущий каталог на другой, то есть сделать текущим другой каталог, нужно воспользоваться оператором ChDir . Дисковое устройство, на котором располагается каталог, должно быть текущим. Если это не так, то вначале следует использовать оператор ChDrive .

Операторы и встроенные функции языка VBA 289

Вот как, например, можно использовать строку с полным именем каталога (то есть, с именем, включающим имя диска) в качестве параметра для операторов ChDir и ChDrive одновременно:

Dim MyPath As String

При этом оператор ChDrive “поймет” только литеру “C” и сделает текущим диск C , а оператор ChDir “поймет” все остальные литеры кроме подстроки “C:” и сделает текущим каталог

Удалить каталог можно посредством оператора RmDir , которому в качестве параметра необходимо указать полное имя каталога, подлежащего удалению. Имя должно включать имя диска, а “обреченный” каталог должен быть пуст. Попытка удалить непустой каталог приведет к ошибке выполнения.

Функция CurDir позволяет узнать имя текущего каталога. В качестве параметра можно указать имя диска, при отсутствии параметра будет иметься в виду текущий диск. Функция возвращает строку полного имени текущего каталога.

Например, если программе требуется сменить каталог, а затем вернуться к исходному каталогу, то она должна “запомнить” имя текущего каталога. Вот, как можно использовать при этом функцию CurDir :

Dim MyPath As String Dim TargetPath As String

MsgBox "Путь к каталогу " + MyPath + " будет сохранен"

TargetPath = "C:\WORK" ChDrive TargetPath ChDir TargetPath

MsgBox "Возвращаемся к каталогу " + MyPath ChDrive MyPath

Сохраненное в строковой переменной MyPath имя текущего каталога используется затем для того, чтобы вернуться к исходному каталогу.

Для того чтобы прочитать имена файлов, содержащихся в каталоге, используют функцию Dir , которая по своему действию аналогична одноименной команде ОС MS DOS.

В качестве параметров этой функции необходимо указать имя каталога и (необязательный параметр) число, задающее атрибуты файлов (это число получается в результате суммирования предопределенных констант Visual Basic). В имя каталога можно добавить маску имен файлов, фор-

290 Приложение. VBA, как язык программирования: данные, синтаксис и функции

мируемую по тем же правилам, что и маска для команд MS DOS: символ “?” замещает любой символ, а символ “*” замещает любое число любых символов.

В результате функция вернет первое имя файла, удовлетворяющего заданным условиям, если, конечно, хотя бы один такой файл существует. Для того чтобы получить все остальные имена,

следует продолжать вызовы функции Dir уже без параметров до тех пор, пока она не вернет пустую строку.

Например, программе требуется получить имена всех файлов с расширением TXT в каталоге

Объявим строковую переменную:

Dim MyFileName As String

Первый вызов функции Dir с указанием каталога:

MyFileName = Dir ("C:\WORK\*.TXT")

Далее вызываем функцию Dir без параметров до тех пор, пока она не вернет пустую строку:

Do While MyFileName <> ""

Переименование файла или каталога (оператор Name)

Для того чтобы переименовать файл или каталог, используют оператор Name…As… В качестве параметров при этом указывают имя файла или каталога, то есть старое его имя, которое еще остается действительным, и новое имя. Оператор Name , подобно соответствующей команде MS DOS, позволяет использовать маскирующие (замещающие) символы в именах для групповых операций с файлами. Понятно, что зачастую изменения в имени файла автоматически влекут за собой его перемещение в другой каталог.

Name "C:\WORK\MyText.txt" As "C:\ARCHIVE\MyTextAr.txt"

Name "C:\WORK" As "C:\TMP\OLDFILES"

Копирование файлов (оператор FileCopy)

Копирование файлов осуществляется при помощи оператора FileCopy . Его параметры — это имя файла, подлежащего копированию, и имя нового файла-копии. Использование маскирующих символов “?” и “*” здесь недопустимо. Например:

FileCopy "C:\WORK\MyText.txt", "C:\WORK\MyBackUp.txt"

Удаления файлов (оператор Kill)

Для удаления файлов используют оператор Kill . Этот оператор позволяет использовать маскирующие символы, но, в отличие от команды Del , удаляет группу файлов без предупреждения. Например, следующий оператор удалит все текстовые файлы в каталоге C:\WORK :

Операторы и встроенные функции языка VBA 291

Как открыть файл (оператор Open)

Прежде чем получить доступ к данным, содержащимся в файле в любом режиме, файл необходимо вначале открыть . Эта задача решается при помощи оператора Open . Синтаксис этого оператора выглядит следующим образом:

Open ИмяФайла For РежимДоступа As НомерФайла

Параметр РежимДоступа . В качестве параметра “РежимДоступа” необходимо использовать одно из ключевых слов, обозначающих различные режимы доступа. Список этих слов представлен в табл. П.6.

ТАБЛИЦА П.6. КЛЮЧЕВЫЕ СЛОВА, ОБОЗНАЧАЮЩИЕ РАЗЛИЧНЫЕ РЕЖИМЫ ДОСТУПА К ФАЙЛУ

\u0430 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f) \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430

Function Fact(s As Byte) As Long\u00a0
\u00a0If s <= 1 Then
\u00a0 \u00a0\u00a0Fact = 1
\u00a0Else
\u00a0 \u00a0\u00a0Fact = s * Fact(s - 1)
\u00a0End If
End Function

\u0438\u00a0\u0443\u0442\u043e\u0447\u043d\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 - \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0447\u0435\u0442 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430
">]" data-testid="answer_box_list">

z31rus

Это основной код макроса с циклом перебора всех нечетных чисел

Sub SummFactorial()
Dim summ As Long
Dim i As Byte
For i = 1 To 9 Step 2
summ = summ + Fact(i)
Next i
MsgBox (summ)
End Sub

а эта функция вызывает сама себя (рекурсия) для расчета факториала

Function Fact(s As Byte) As Long
If s End Function

и уточните, если нужно, что должно быть в подпрограмме - весь код или только расчет факториала



= Мир MS Excel/Факториалы - Мир MS Excel

Войти через uID

Войти через uID

Чтобы макрописатели не скучали в данной ветке, предлагаю задачу:

Необходимо вычислить 200! (факториал двухсот)
Нужно получить все 375 значащих цифр

Данную задучу удобнее решать на VBA но и формулами ее можно решить, правда придется задействовать много ячеек

Чтобы макрописатели не скучали в данной ветке, предлагаю задачу:

Необходимо вычислить 200! (факториал двухсот)
Нужно получить все 375 значащих цифр

Данную задучу удобнее решать на VBA но и формулами ее можно решить, правда придется задействовать много ячеек MCH

Необходимо вычислить 200! (факториал двухсот)
Нужно получить все 375 значащих цифр

Данную задучу удобнее решать на VBA но и формулами ее можно решить, правда придется задействовать много ячеек Автор - MCH
Дата добавления - 10.11.2012 в 18:27

Так это опечатка или действительно каким-то образом можно вычислить факториал 200 (в Экселе)?
В ВБА начиная со 171! = возвращается бесконечность

Так это опечатка или действительно каким-то образом можно вычислить факториал 200 (в Экселе)?
В ВБА начиная со 171! = возвращается бесконечность LightZ


Конкатенация, думаю, может помочь получить текст длиною 375 знаков. Автор - ZORRO2005
Дата добавления - 10.11.2012 в 22:06


Возможно это подсказка и всё очень просто?
Вариант см. во вложении Автор - LightZ
Дата добавления - 10.11.2012 в 23:48

Результат совпадает с моим

У меня есть решение на макросах и чисто на формулах, чуть позже выложу, нужно еще другим форумчанам дать подумать

Результат совпадает с моим

У меня есть решение на макросах и чисто на формулах, чуть позже выложу, нужно еще другим форумчанам дать подумать MCH

Результат совпадает с моим

У меня есть решение на макросах и чисто на формулах, чуть позже выложу, нужно еще другим форумчанам дать подумать Автор - MCH
Дата добавления - 10.11.2012 в 23:58

78865786736479050355236321393218506229513597768717326329474253324435944996340334292030428401198462390417721213891963883025764279024263710506 19266249528299311134628572707633172373969889439224456214516642402540332918641312274282948532775242424075739032403212574055795686602260319041 70324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000

за 2 тика (31-32 мс)
а дальше что?

как сравнить?
пс. код пока не выкладывать, что ли?
ппс. сорри, если что не так.
пппс. а вот факториал 2000 (число из 5736 цифр) у меня считается уже больше 10 сек. (точнее - 10,5-10,6)

78865786736479050355236321393218506229513597768717326329474253324435944996340334292030428401198462390417721213891963883025764279024263710506 19266249528299311134628572707633172373969889439224456214516642402540332918641312274282948532775242424075739032403212574055795686602260319041 70324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000

за 2 тика (31-32 мс)
а дальше что?

как сравнить?
пс. код пока не выкладывать, что ли?
ппс. сорри, если что не так.
пппс. а вот факториал 2000 (число из 5736 цифр) у меня считается уже больше 10 сек. (точнее - 10,5-10,6) ikki

78865786736479050355236321393218506229513597768717326329474253324435944996340334292030428401198462390417721213891963883025764279024263710506 19266249528299311134628572707633172373969889439224456214516642402540332918641312274282948532775242424075739032403212574055795686602260319041 70324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000

за 2 тика (31-32 мс)
а дальше что?

как сравнить?
пс. код пока не выкладывать, что ли?
ппс. сорри, если что не так.
пппс. а вот факториал 2000 (число из 5736 цифр) у меня считается уже больше 10 сек. (точнее - 10,5-10,6) Автор - ikki
Дата добавления - 11.11.2012 в 17:36

я тоже не знаю правильный ли, но у меня такой же получился

я тоже не знаю правильный ли, но у меня такой же получился

я тоже не знаю правильный ли, но у меня такой же получился


Подождем формулистов, может кто на формулах посчитает Автор - MCH
Дата добавления - 11.11.2012 в 17:57

ZORRO2005, ну надо же - одинаково.
даже удивительно.
правда, алгоритм у меня до отвращения простой. ikki

столбиком?
Другого не представляю
Хотя наверно можно формулу Стирлинга прикрутить, но больно она сложная для реализации

Думаю, что кто решил 200!, тому несложно посчитать и 1000! (2568 знаков) и 10000! (не стал считать)

Мне было интересно реализовать длинную арифметику в VBA
При поиске в интернете вариантов работы с длинной арифметикой на бейсике ничего подходящего не нашел, пришлось писать самомтоятельно, хотя алгоритмы на C имеются, а в Java вообще есть встроенный класс с длинной арифметикой, ничего самому придумывать не нужно

Реализовал несколько функций с длинкой: умножение длинных чисел, сложение/вычитание длинных чисел, деление длинного на короткое, квадратный корень пока еще не реализовал, чуть позже выложу

столбиком?
Другого не представляю
Хотя наверно можно формулу Стирлинга прикрутить, но больно она сложная для реализации

Думаю, что кто решил 200!, тому несложно посчитать и 1000! (2568 знаков) и 10000! (не стал считать)

Мне было интересно реализовать длинную арифметику в VBA
При поиске в интернете вариантов работы с длинной арифметикой на бейсике ничего подходящего не нашел, пришлось писать самомтоятельно, хотя алгоритмы на C имеются, а в Java вообще есть встроенный класс с длинной арифметикой, ничего самому придумывать не нужно

Реализовал несколько функций с длинкой: умножение длинных чисел, сложение/вычитание длинных чисел, деление длинного на короткое, квадратный корень пока еще не реализовал, чуть позже выложу MCH

столбиком?
Другого не представляю
Хотя наверно можно формулу Стирлинга прикрутить, но больно она сложная для реализации

Думаю, что кто решил 200!, тому несложно посчитать и 1000! (2568 знаков) и 10000! (не стал считать)

Мне было интересно реализовать длинную арифметику в VBA
При поиске в интернете вариантов работы с длинной арифметикой на бейсике ничего подходящего не нашел, пришлось писать самомтоятельно, хотя алгоритмы на C имеются, а в Java вообще есть встроенный класс с длинной арифметикой, ничего самому придумывать не нужно

Реализовал несколько функций с длинкой: умножение длинных чисел, сложение/вычитание длинных чисел, деление длинного на короткое, квадратный корень пока еще не реализовал, чуть позже выложу Автор - MCH
Дата добавления - 11.11.2012 в 18:18


Попадалась эта надстройка, но не смог разобратся, т.к. английского не знаю, пришлось изобретать велосипед


Попадалась эта надстройка, но не смог разобратся, т.к. английского не знаю, пришлось изобретать велосипед MCH


Попадалась эта надстройка, но не смог разобратся, т.к. английского не знаю, пришлось изобретать велосипед Автор - MCH
Дата добавления - 11.11.2012 в 19:07

пс. в той теме есть готовая dll

пс. в той теме есть готовая dll ikki

пс. в той теме есть готовая dll Автор - ikki
Дата добавления - 11.11.2012 в 19:17

Саш, спасибо за ссылку, посмотрел твою реализацию, отметил полезным хранить длину числа, может ускорить некоторые моменты.
Я у себя брал основание 10000 вместо 10, немного сложнее вывод, но считать должно быстрее.

т.к. уже есть и не одно решение на макросах, выкладываю свою реализацию длинки.
Не гарантирую оптимальности кода как по размеру, так и по скорости, но это мой велосипед

В пиложенном файле несколько задач, в качестве примера, решаемых с помощью длинной арифметики: факториалы, степень двойки, числа Фибоначчи, задача о счастливых билетах

Саш, спасибо за ссылку, посмотрел твою реализацию, отметил полезным хранить длину числа, может ускорить некоторые моменты.
Я у себя брал основание 10000 вместо 10, немного сложнее вывод, но считать должно быстрее.

т.к. уже есть и не одно решение на макросах, выкладываю свою реализацию длинки.
Не гарантирую оптимальности кода как по размеру, так и по скорости, но это мой велосипед

В пиложенном файле несколько задач, в качестве примера, решаемых с помощью длинной арифметики: факториалы, степень двойки, числа Фибоначчи, задача о счастливых билетах MCH

т.к. уже есть и не одно решение на макросах, выкладываю свою реализацию длинки.
Не гарантирую оптимальности кода как по размеру, так и по скорости, но это мой велосипед

В пиложенном файле несколько задач, в качестве примера, решаемых с помощью длинной арифметики: факториалы, степень двойки, числа Фибоначчи, задача о счастливых билетах Автор - MCH
Дата добавления - 11.11.2012 в 19:46

Факториал числа часто используется, например, для расчета количества перестановок или вычисления биномиальных коэффициентов. Рассмотрим особенности использования факториала в Excel.

Для начала освежим в памяти что же такое факториал числа. Факториал числаn — произведение натуральных чисел от 1 до n (включительно), обозначается как n!. В общем виде формула расчета факториала имеет вид n!=1*2*3*…*n, при этом по умолчанию считается, что 0!=1. Наибольшее применение факториал имеет в комбинаторике и теории чисел.

Перейдем от теории к практике. Для расчета факториала в Excel применяется функция ФАКТР:

ФАКТР(число)Возвращает факториал числа, равный 1*2*3*…*число.

  • Число(обязательный аргумент) — натуральное число (т.е. целое неотрицательное), факториал которого вычисляется.

faktorial_chisla_1.jpg

В случае, если в качестве аргумента функции было введено нецелое число, то оно округляется в меньшую сторону.

В этой статье я расскажу о факториале, его свойствах и о том, как вычислить его значение с помощью Excel. Мы проверим, как точно вычисляет значение факториала формула Стирлинга и разберем решение типовых задач с факториалами, а на закуску – несколько видеороликов (и конечно расчетный файл эксель). Удачи!

Что такое факториал?

Символ $n!$ называется факториалом и обозначает произведение всех целых чисел от $1$ до $n$. Факториал определен только для целых неотрицательных чисел.

$$n!=1cdot 2cdot 3 cdot . cdot (n-1) cdot n$$

По определению, считают, что $0!=1, 1!=1$. Далее:

$$ 2!=1 cdot 2 = 2, 3!=1 cdot 2 cdot 3= 6, 4!=1 cdot 2 cdot 3cdot 4= 24, 5!=1 cdot 2 cdot 3cdot 4cdot 5= 120, . $$

Факториал растет невероятно быстро (недаром он обозначается восклицательным знаком!), существенно быстрее степенной $x^n$ или даже экспоненциальной функции $e^n$ (но медленее чем $e^$)

Факториал широко применяется в комбинаторике – он равен числу всех перестановок $n$-элементного множества, а также входит в формулы для числа сочетаний и размещений. Факториал встречается в математическом анализе (чаще при разложениях функции в степенные ряды), а также в функциональном анализе и теории чисел.

Формулы и свойства факториала

Рекуррентная формула для факториала:

Факториал связан с гамма-функцией по формуле: $n!= Gamma(n+1)$. Фактически, гамма-функция – обобщение понятия факториала на все положительные вещственные функции.

Для любого натурального $n$ выполняется:

$$ (n!)^2 ge n^n ge n! ge n. $$

Любопытная формула связывает факториал и производную степенной функции:

Формула Стирлинга

Для приближенного вычисления факториала применяют асимптотическую формулу Стирлинга:

Обычно для расчетов берут только главный член:

Ниже вы увидите пример расчета факториала по обычной формуле и с помощью формулы Стирлинга, которая, как видно, дает вполне хорошее приближение (начиная с $n=9$ относительная погрешность уже меньше 1%).

Расчет факториала в Эксель

Для нахождения факториала в Excel нужно использовать специальную функцию =ФАКТР($n$) , где $n$ – число, факториал которого нужно найти.

Пример расчета и ввода формулы ниже на скриншоте, также вы можете скачать расчетный файл

fact_excel.jpg

Примеры задач с факториалом

Рассмотрим решение типовых задач.

Пример 1.На полке стоят 8 дисков. Сколькими способами их можно расставить между собой?

Решение. Требуется найти число всех перестановок 8 различных объектов, что вычисляется как раз как факториал:

$$N=8!=1 cdot 2 cdot 3cdot 4cdot 5cdot 6cdot 7cdot 8=40320.$$

Пример 3.Упростить выражение

Пример 4.Упростить дробь, содержащую факториал:

Небольшое учебное видео про факториал – определение, свойства, как быстро растет, как вычислить в Excel по встроенной формуле и по приближенной формуле Стирлинга.

Расчетный файл из видео можно скачать

Напоследок – насколько быстро растет факториал!

Excel работает за вас

Excel works!

Thanks for Visiting

backtotop.jpg

Факториал в Excel

Факториал в Excel. Введение

Думаю углубляться в мат. часть сильно не стоит. Считаю нужно рассказать для чего используется эта функция и как ее считать в Excel.

Начнем с определения, как говорит нам Википедия — Факториал числа n (от лат. factorialis — умножающий, действующий) — это произведение всех натуральных чисел от 1 до n включительно.

Для чего это может понадобится? В первую очередь — это обозначение умножения нескольких чисел 3! = 1*2*3. Факториал очень часто используется в комбинаторике. Что такое комбинаторика? Как следует из названия — это наука изучающая математические комбинации.

Пример: Сколько сочетаний цветов получится из 10 разных цветов? Сходу знаете? Я например, нет. Для вычисления кол-ва комбинаций применяется факториал.

Рассчитаем для 3 цветов: количество комбинаций цветов (желтый, красный, зеленый) = 3! =1*2*3 = 6. Какие это комбинации:

В более сложных задачах в жизни, часто нужно узнать, к примеру, какое количество, вариантов выполнения маршрута из 7 точек. Как видите, штука полезная!

Факториал в Excel. Как посчитать.

Для факториала есть специальная функция =ФАКТР() Реквизиты предельно просты — один аргумент, то число до которого нужно рассчитать факториал

Пример такой формулы

Рассчитав факториал 7, мы узнаем, что количество вариантов маршрута из 7 точек равно 5040. По-моему это впечатляет!

Вычисление факториала натуральных (неотрицательных целых) чисел с помощью пользовательской функции Factorial. Ограничение для VBA Excel по типу данных.

Содержание 1. Вычисление факториала 2. Функция Factorial 3. Ограничение по типу данных

Вычисление факториала

Факториал – это функция, определяемая для натурального числа n как произведение всех неотрицательных целых чисел от 1 до n включительно.

Формула, по которой вычисляется факториал, записывается следующим образом:

n! = 1 · 2 · . · n

Пример: 3! = 1 · 2 · 3 = 6

В соответствии с формулой факториала, будет верным следующее соотношение:

(n-1)! = n! : n

Если принять для этого равенства n = 1, тогда получим:

0! = 1

Функция Factorial

Для вычисления факториала натуральных чисел можно использовать следующую пользовательскую функцию:

Первое условие функции Factorial ( If Not IsNumeric(n) Or n = Empty ) проверяет, не является ли значение ячейки не числом. Второе условие ( ElseIf n ) проверяет, не является ли число в ячейке отрицательным.

Далее, если функция Factorial не завершила работу, переменной p присваивается значение 1, которое возвратит функция, если значение переменной n будет равно нулю или единице.

Значение ячейки (переменная n) округляется до целого и, если оно окажется больше единицы, вычисляется факториал с помощью цикла For… Next.

Пользовательская функция Factorial возвратит значение, присвоенное ей из переменной p.

Ограничение по типу данных

Максимальное значение пользовательской функции Factorial будет ограничено максимальным значением типа данных Double (1,79769313486232Е+308).

picture216.jpg

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи. Используемые источники:

Читайте также: