sample042.PAS

{* Умножение длинных натуральных десятичных чисел *}

Unit SAMPLE042;
Interface
Implementation
Begin
 writeln('Умножение длинных натуральных десятичных чисел');
End.

Program pas;

Uses sample042.pas; {* Эту строку можно удалить *}
{ арифметические алгоритмы: умножение длинных натуральных десятичных чисел }
{ Введенное число помещается поразрядно в массив ROW.                      }
{ Могут умножаться числа до 10000 разрядов                                 }
{ ------------------------------------------------------------------------ }
{$A + , B - , D + , E + , F - , G + , I + , L + , N + , O - , P - , Q - , R - , S + , T - , V + , X + , Y + }
{$M 16384, 0, 655360}
Uses crt; {* Подключение модулей *}
Var { -------- use calc factorial --------- }
  row : Array[1..20000] Of byte;
  col : Array[1..10000] Of byte;
  nr  : integer;
  nc  : integer;
  dp  : integer;
  c   : char;
Procedure PrintResult;
Begin
  write('Р е з у л ь т а т = ');
  While (dp0) Do
  Begin
    i := cr;
    j := cc;
    sum := carry;
    While (i = 1) Do
    Begin
      sum := sum + row[i] * col[j];
      inc(i); {* Прибавим к i единицу *}
      dec(j); {* Вычтем из j единицу *}
    End;
    row[dp] := sum Mod 10;
    dec(dp); {* dp-- *}
    carry := sum Div 10;
    If cr > 1 Then
      dec(cr) {* cr-- *}
    Else dec(cc); {* Уменьшаем cc на 1 *}
  End;
  While (carry0) Do
  Begin
    row[dp] := carry Mod 10;
    carry := carry Div 10;
    dec(dp); {* Вычтем из dp единицу *}
  End;
  inc(dp); {* Увеличиваем dp на 1 *}
End;
Begin
  fillchar(row, sizeof(row), 0);
  fillchar(col, sizeof(col), 0); {поразрядный ввод 1 - го числа}
  writeln('введите 1 - е число число:');
  c := #0;
  While Not(c In ['0'..'9']) Do
    c := readkey; {* Ждем нажатия пользователя *}
  nr := 0;
  While (c In ['0'..'9']) Do
  Begin
    write(c);
    inc(nr); {* Увеличиваем nr на 1 *}
    row[nr] := ord(c) - ord('0');
    c := readkey; {* Нажмите любую клавишу *}
  End;
  writeln; {поразрядный ввод 2 - го числа}
  writeln('введите 2 - е число число:');
  While Not(c In ['0'..'9']) Do
    c := readkey; {* Ждем нажатия пользователя *}
  nc := 0;
  While (c In ['0'..'9']) Do
  Begin
    write(c);
    inc(nc); {* Прибавим к nc единицу *}
    col[nc] := ord(c) - ord('0');
    c := readkey; {* Нажмите любую клавишу *}
  End;
  writeln; {выхов процедуры умножения, затем - вызов процедуры вывода результата}
  Multiplying;
  PrintResult;
End.