Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Процедура для нахождения точного значения факториала числа

Процедура для нахождения точного значения факториала числа.

Вы когда-нибудь находили факториал 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: array of integer;
    //"M"- это матрица, или массив, причем динамический, то есть его размеры можно
  F, i, j, k, n: integer;
    //изменять, это увеличивает время выполнения программы, но интересно попробовать
begin
  if 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 do
  begin
    F := 0;
    PB.StepBy(i * 2); //изменение показаний PB
    for j := 0 to k do
    begin
      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 до 0
  begin
    if 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 = true then
    mmoutput.Lines.Add('В этом числе ' + IntToStr(length(result)) + ' цифр.');
  M := nil; //освобождение памяти IntToStr-преобразование числа в строку
  screen.Cursor := crDefault; //смена курсора
  Med.Text := '';
  Med.SetFocus; //передача фокуса ввода компоненту med
end;

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay