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

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

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

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

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

textual
Листинг программы
  1. { Сложение и умножение длинных чисел без использования арифметических операций и преобразований типов. ("Плюсы" можно заменить на Concat) }
  2. Const
  3.   TM : array['0'..'9','0'..'9'] of String[2] =
  4.      (('00','00','00','00','00','00','00','00','00','00'),
  5.       ('00','01','02','03','04','05','06','07','08','09'),
  6.       ('00','02','04','06','08','10','12','14','16','18'),
  7.       ('00','03','06','09','12','15','18','21','24','27'),
  8.       ('00','04','08','12','16','20','24','28','32','36'),
  9.       ('00','05','10','15','20','25','30','35','40','45'),
  10.       ('00','06','12','18','24','30','36','42','48','54'),
  11.       ('00','07','14','21','28','35','42','49','56','63'),
  12.       ('00','08','16','24','32','40','48','56','64','72'),
  13.       ('00','09','18','27','36','45','54','63','72','81'));
  14.   TP : array['0'..'9','0'..'9'] of String[2] =
  15.      (('00','01','02','03','04','05','06','07','08','09'),
  16.       ('01','02','03','04','05','06','07','08','09','10'),
  17.       ('02','03','04','05','06','07','08','09','10','11'),
  18.       ('03','04','05','06','07','08','09','10','11','12'),
  19.       ('04','05','06','07','08','09','10','11','12','13'),
  20.       ('05','06','07','08','09','10','11','12','13','14'),
  21.       ('06','07','08','09','10','11','12','13','14','15'),
  22.       ('07','08','09','10','11','12','13','14','15','16'),
  23.       ('08','09','10','11','12','13','14','15','16','17'),
  24.       ('09','10','11','12','13','14','15','16','17','18'));
  25.   TP1 : array['0'..'9'] of String[2] = ('01','02','03','04','05','06','07','08','09','10');
  26.  
  27. Function Plus(a,b : String) : String;
  28. Var i : Integer;
  29.     k : Boolean;
  30.   Function Per(ca,cb : Char; Var pn : Boolean) : Char;
  31.   Begin
  32.     If pn then
  33.     Begin
  34.       Per:=TP1[TP[ca,cb][2]][2];
  35.       pn:= (TP[ca,cb][1]='1') or (TP1[TP[ca,cb][2]][1]='1');
  36.     end
  37.       else
  38.       Begin
  39.         Per:=TP[ca,cb][2];
  40.         pn:=TP[ca,cb][1]='1';
  41.       end;
  42.   end;
  43. Begin
  44.   While (Length(a)>1) and (a[1]='0') do Delete(a,1,1);
  45.   While (Length(b)>1) and (b[1]='0') do Delete(b,1,1);
  46.   While Length(a)<Length(b) do a:='0'+a;
  47.   While Length(b)<Length(a) do b:='0'+b;
  48.   k:=False;
  49.   For i:=Length(b) downto 1 do
  50.     a[i]:=Per(a[i],b[i],k);
  51.   If k then a:='1'+a;
  52.   Plus:=a;
  53. end;
  54.  
  55. Function Mul(a,b,tmp : String) : String;
  56. Var i    : Integer;
  57.     s,st : String;
  58.     c    : Char;
  59. Begin
  60.   s:=''; c:='0';
  61.   If (a in ['0','']) or (b in ['0','']) then Mul:='0'
  62.    else
  63.    Begin
  64.      For i:=Length(a) downto 1 do
  65.      Begin
  66.        st:=Plus(TM[b[Length(b)],a[i]],c);
  67.        s:=st[Length(st)]+s;
  68.        If Length(st)>1 then c:=st[1] else c:='0';
  69.      end;
  70.      s:=s+tmp;
  71.      If c<>'0' then s:=c+s;
  72.      Mul:=Plus(s,Mul(a,Copy(b,1,Length(b)-1),tmp+'0'));
  73.    end;
  74. end;
  75.  
  76. Function Xy(X,Y : String) : Boolean; {X>Y - True}
  77. Var ii : Byte;
  78. Begin
  79.   Xy:=True;
  80.   If Length(X)>Length(Y) then Exit;
  81.   If Length(X)<Length(Y) then
  82.   Begin
  83.     Xy:=False;
  84.     Exit;
  85.   End;
  86.   For ii:=1 to Length(X) do
  87.     If X[ii]<Y[ii] then
  88.     Begin
  89.       Xy:=False;
  90.       Exit;
  91.     End;
  92. End;
  93.  
  94. Var a,b,c : String;
  95. Begin
  96.   Readln(a);
  97.   Readln(b);
  98.   Readln(c);
  99.   Writeln(a,' * ',b,' = ',Mul(a,b,''));
  100.   Writeln(b,' * ',c,' = ',Mul(b,c,''));
  101.   Writeln(a,' * ',c,' = ',Mul(a,c,''));
  102.   Write('Меньшее произведение: ');
  103.   If Xy(Mul(b,c,''),Mul(a,b,'')) and Xy(Mul(a,c,''),Mul(a,b,'')) then Writeln(a,' * ',b,' = ',Mul(a,b,''));
  104.   If Xy(Mul(a,c,''),Mul(b,c,'')) and Xy(Mul(a,b,''),Mul(b,c,'')) then Writeln(b,' * ',c,' = ',Mul(b,c,''));
  105.   If Xy(Mul(a,b,''),Mul(a,c,'')) and Xy(Mul(b,c,''),Mul(a,c,'')) then Writeln(a,' * ',c,' = ',Mul(a,c,''));  
  106. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы