Процедура для нахождения точного значения факториала числа
Процедура для нахождения точного значения факториала числа.
Вы когда-нибудь находили факториал 10? - это легко, а 20?,а 100? Даже с помощью самого продвинутого калькулятора это не получится, (имею в виду точное значение, например в 100!-158 цифр, какой должен быть дисплей калькулятора, чтобы показать такое значение??!)C помощью программы содержащей алгоритм похожий на описанный, это можно сделать. Для такой программы нужна форма(form, содержащая такие компоненты Memo(имя в процедуре mmOutput), Maskedit(med),ProgressBar(PB-это не обязательно, но если считаешь очень большой факториал, то это занимает некоторое время, поэтому визуально следить за временем, оставшимся на вычисление, очень удобно). Идея программы: переменные в Delphi не могут содержать таких длинных чисел, поэтому здесь используется массив целых переменных, обрабатывая который и получаем нужный ответ. В результате можно считать факториалы многотысячных чисел, я считал 5000!,дальше считать долго, но возможно.
procedure TForm1.bbRunClick(Sender: TObject); //обработка события от мышиvar//это раздел указания переменных
result: string; //переменная result целого типа
M: arrayof integer;
//"M"- это матрица, или массив, причем динамический, то есть его размеры можно
F, i, j, k, n: integer;
//изменять, это увеличивает время выполнения программы, но интересно попробоватьbeginif med.text = "" then
med.text := "0"; //свойство text компонента med проверяется на наличие
n := StrToInt(Trim(MEd.Text));
//введенного числа, StrToInt-преобразование строки в числоif n < 4 then
exit; //trim-удаление пробелов из строки
PB.Max := (n + sqr(n)); //Это определение размеров PB
PB.Position := 0;
screen.Cursor := crHourGlass;
//появляется новый курсор, стандартный "виндовский"
setLength(M, 2); //определение границ массива
M[0] := 1; //присвоение 0-ому элементу массива М значения 1....
M[1] := 0;
k := 1;
for i := 1 to n dobegin
F := 0;
PB.StepBy(i * 2); //изменение показаний PBfor j := 0 to k dobegin
SetLength(M, k + 1);
M[j] := M[j] * i + F; //здесь основная идея программыif (M[j] div 10) > 0 then
k := k + 1;
F := M[j] div 10;
M[j] := M[j] mod 10;
end;
end;
for i := k downto 0 do//перебор целых значений от k до 0beginif M[i] > 0 then
break;
if M[i] = 0 then
k := k - 1;
end;
SetLength(M, k); //изменение размеров массива М до кол-ва элементов-k
Result := "";
for j := k downto 0 do
Result := Result + IntToStr(M[j]);
mmOutput.Lines.Add(IntToStr(n) + "! = " + result);
//добавление результата в редактор Memo(mmOutput)if n6.Checked = truethen
mmoutput.Lines.Add("В этом числе " + IntToStr(length(result)) + " цифр.");
M := nil; //освобождение памяти IntToStr-преобразование числа в строку
screen.Cursor := crDefault; //смена курсора
Med.Text := "";
Med.SetFocus; //передача фокуса ввода компоненту medend;
Если Вас заинтересовала или понравилась информация по разработке на Delph - "Процедура для нахождения точного значения факториала числа", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!