Подпрограммы и Строки: длинная арифметика, умножение - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Даны три строки символов a, b и c, состоящие только из цифр . Считая, что каждая строка представляет собой целое число, опреде-лить, какое из трех чисел: a•b, b•c или a•c меньше двух других. Указание: дли-ны строк могут быть таковы, что значение не войдет ни в один целочислен-ный тип данных. Реализовать подпрограммы ввода, выводы строки-числа, произведения двух строк-чисел, сравнения двух строк-чисел

Решение задачи: «Подпрограммы и Строки: длинная арифметика, умножение»

textual
Листинг программы
{ Сложение и умножение длинных чисел без использования арифметических операций и преобразований типов. ("Плюсы" можно заменить на Concat) }
Const
  TM : array['0'..'9','0'..'9'] of String[2] =
     (('00','00','00','00','00','00','00','00','00','00'),
      ('00','01','02','03','04','05','06','07','08','09'),
      ('00','02','04','06','08','10','12','14','16','18'),
      ('00','03','06','09','12','15','18','21','24','27'),
      ('00','04','08','12','16','20','24','28','32','36'),
      ('00','05','10','15','20','25','30','35','40','45'),
      ('00','06','12','18','24','30','36','42','48','54'),
      ('00','07','14','21','28','35','42','49','56','63'),
      ('00','08','16','24','32','40','48','56','64','72'),
      ('00','09','18','27','36','45','54','63','72','81'));
  TP : array['0'..'9','0'..'9'] of String[2] =
     (('00','01','02','03','04','05','06','07','08','09'),
      ('01','02','03','04','05','06','07','08','09','10'),
      ('02','03','04','05','06','07','08','09','10','11'),
      ('03','04','05','06','07','08','09','10','11','12'),
      ('04','05','06','07','08','09','10','11','12','13'),
      ('05','06','07','08','09','10','11','12','13','14'),
      ('06','07','08','09','10','11','12','13','14','15'),
      ('07','08','09','10','11','12','13','14','15','16'),
      ('08','09','10','11','12','13','14','15','16','17'),
      ('09','10','11','12','13','14','15','16','17','18'));
  TP1 : array['0'..'9'] of String[2] = ('01','02','03','04','05','06','07','08','09','10');
 
Function Plus(a,b : String) : String;
Var i : Integer;
    k : Boolean;
  Function Per(ca,cb : Char; Var pn : Boolean) : Char;
  Begin
    If pn then
    Begin
      Per:=TP1[TP[ca,cb][2]][2];
      pn:= (TP[ca,cb][1]='1') or (TP1[TP[ca,cb][2]][1]='1');
    end
      else
      Begin
        Per:=TP[ca,cb][2];
        pn:=TP[ca,cb][1]='1';
      end;
  end;
Begin
  While (Length(a)>1) and (a[1]='0') do Delete(a,1,1);
  While (Length(b)>1) and (b[1]='0') do Delete(b,1,1);
  While Length(a)<Length(b) do a:='0'+a;
  While Length(b)<Length(a) do b:='0'+b;
  k:=False;
  For i:=Length(b) downto 1 do
    a[i]:=Per(a[i],b[i],k);
  If k then a:='1'+a;
  Plus:=a;
end;
 
Function Mul(a,b,tmp : String) : String;
Var i    : Integer;
    s,st : String;
    c    : Char;
Begin
  s:=''; c:='0';
  If (a in ['0','']) or (b in ['0','']) then Mul:='0'
   else
   Begin
     For i:=Length(a) downto 1 do
     Begin
       st:=Plus(TM[b[Length(b)],a[i]],c);
       s:=st[Length(st)]+s;
       If Length(st)>1 then c:=st[1] else c:='0';
     end;
     s:=s+tmp;
     If c<>'0' then s:=c+s;
     Mul:=Plus(s,Mul(a,Copy(b,1,Length(b)-1),tmp+'0'));
   end;
end;
 
Function Xy(X,Y : String) : Boolean; {X>Y - True}
Var ii : Byte;
Begin
  Xy:=True;
  If Length(X)>Length(Y) then Exit;
  If Length(X)<Length(Y) then
  Begin
    Xy:=False;
    Exit;
  End;
  For ii:=1 to Length(X) do
    If X[ii]<Y[ii] then
    Begin
      Xy:=False;
      Exit;
    End;
End;
 
Var a,b,c : String;
Begin
  Readln(a);
  Readln(b);
  Readln(c);
  Writeln(a,' * ',b,' = ',Mul(a,b,''));
  Writeln(b,' * ',c,' = ',Mul(b,c,''));
  Writeln(a,' * ',c,' = ',Mul(a,c,''));
  Write('Меньшее произведение: ');
  If Xy(Mul(b,c,''),Mul(a,b,'')) and Xy(Mul(a,c,''),Mul(a,b,'')) then Writeln(a,' * ',b,' = ',Mul(a,b,''));
  If Xy(Mul(a,c,''),Mul(b,c,'')) and Xy(Mul(a,b,''),Mul(b,c,'')) then Writeln(b,' * ',c,' = ',Mul(b,c,''));
  If Xy(Mul(a,b,''),Mul(a,c,'')) and Xy(Mul(b,c,''),Mul(a,c,'')) then Writeln(a,' * ',c,' = ',Mul(a,c,''));  
end.

Объяснение кода листинга программы

{ Входные данные: а, b, c }

  1. Сначала в функции Plus создается вспомогательная функция Per, которая принимает три аргумента: ca, cb (символы двух длинных чисел) и pn (флаг, указывающий, является ли текущий символ разрядом десятков или единиц). Функция возвращает результат сложения соответствующих разрядов.
  2. В основной функции Mul используется цикл, который проходит по каждому символу второго числа (начиная с конца). На каждой итерации выполняется следующая последовательность действий: a) создается временная строка st, которая содержит результат сложения соответствующего разряда первого числа и текущего разряда второго числа; b) символ, соответствующий этому разряду, добавляется в конец строки s; c) Если полученная строка st имеет длину более одного символа, то следующий символ в ней становится новым первым символом, а старый первый символ становится последним в строке s. Если первый символ полученной строки равен '0', то он удаляется из строки s.
  3. В основной функции Mul также создается временная строка tmp, которая содержит строку из цифр от 0 до 9. Эта строка добавляется к результату умножения.
  4. В функции Xy сравниваются строки X и Y. Если длина строки X больше длины строки Y, то функция возвращает False. Если длина строки X меньше длины строки Y, то функция возвращает True. Если строки равны, то функция сравнивает их символы по порядку. Если символ в строке X меньше соответствующего символа в строке Y, то функция возвращает False. Если все символы равны, то функция возвращает True.
  5. В основной части программы сначала считываются строки a, b и c. Затем выводятся результаты умножения a на b и c на b.
  6. После этого выводится сообщение Меньшее произведение: и сравниваются произведения в различных комбинациях. Если произведение a и b меньше, чем произведение b и c, и произведение a и c меньше, чем произведение a и b, то выводится сообщение Меньшее произведение: a * b =, где a и b - это два меньших произведения. Если произведение a и b меньше, чем произведение b и c, и произведение a и c больше, чем произведение a и b, то выводится сообщение Меньшее произведение: b * c =, где b и c - это два меньших произведения. Если произведение a и b больше, чем произведение b и c, и произведение a и c меньше, чем произведение a и b, то выводится сообщение Меньшее произведение: a * c =, где a и c - это два меньших произведения.

ИИ поможет Вам:


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

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы