Длинная арифметика. Факториал числа (1-810)

Применение алгоритмов «длинной арифметики» для вычисления факториала числа. (Стандартные возможности позволяют вычислить факториал до 12)

Более детально — тут

uses crt;
const
  nmax = 2100;//количество цифр в результате

type
  ts = 0..9;
  chislo = array[1..nmax] of ts;

procedure nul(var a: chislo);//аналог Zero
var
  i: 1..nmax;
begin
  for i := 1 to nmax do
    a[i] := 0;
end;

procedure perevod(s: string; var a: chislo);//аналог Translate
var
  i, n: 1..nmax;
begin
  n := length(s);
  nul(a);
  for i := 1 to n do
    a[n - i + 1] := ord(s[i]) - ord('0');
end;

function kol(const a: chislo): word;//аналог Dlina
var
  i: 1..nmax;
begin
  i := nmax;
  while(a[i] = 0) and (i > 1) do
    i := i - 1;
  kol := i;
end;

procedure umn(var a, b, c: chislo);//аналог Multiplication
var
  i, g, n, m: 1..nmax; 
  p, v: ts;
begin
  nul(c);
  m := kol(a);
  n := kol(b);
  for i := 1 to m do
  begin
    p := 0;
    for g := 1 to n do
    begin
      v := a[i] * b[g] + p + c[i + g - 1];
      c[i + g - 1] := v mod 10;
      p := v div 10;
    end;
    c[i + n] := p;
  end;
end;

procedure pechat(var a: chislo);//аналог Print
var
  i: 1..nmax;
begin
  for i := kol(a) downto 1 do
    write(a[i]);
  writeln;
end;

procedure sum(a, b: chislo; var c: chislo);//этого у Вас нет, сумма длинных
                                       // в данном случае получение следующего числа +1
var
  i, j, r: 1..nmax; 
  p: ts;
begin
  p := 0;
  for j := 1 to kol(a) do
  begin
    r := b[j] + a[j] + p;
    p := r div 10;
    c[j] := r mod 10;
  end;
  c[j + 1] := p;
end;

var
  s: string; 
  a, b, c, d, q: chislo; 
  i, n, f: 1..nmax;

begin
  clrscr;
  repeat
    write('Введите число от 1 до 810 n=');
    readln(n);
  until (n > 1) and (n < 811);
  //создаем 4 числа для операций добавления и умножения
  nul(b);
  b[1] := 1;
  nul(c);
  nul(a);
  a[1] := 1;
  c[1] := 1;
  d[1] := 1;
  for i := 2 to n do
  begin
    for f := 1 to nmax do
      a[f] := c[f];//запоминаем предыдущий множитель
    sum(a, d, c);//получаем следующий на 1 больше
    umn(b, c, q);//домножаем предыдущий результат результат=получаем факториал
    for f := 1 to nmax do
      b[f] := q[f];//запоминаем новый результат
  end;
  pechat(q);
  readln
end.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии