Подпрограммы и Строки: длинная арифметика, умножение - 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 }
- Сначала в функции
Plus
создается вспомогательная функцияPer
, которая принимает три аргумента: ca, cb (символы двух длинных чисел) и pn (флаг, указывающий, является ли текущий символ разрядом десятков или единиц). Функция возвращает результат сложения соответствующих разрядов. - В основной функции
Mul
используется цикл, который проходит по каждому символу второго числа (начиная с конца). На каждой итерации выполняется следующая последовательность действий: a) создается временная строкаst
, которая содержит результат сложения соответствующего разряда первого числа и текущего разряда второго числа; b) символ, соответствующий этому разряду, добавляется в конец строкиs
; c) Если полученная строкаst
имеет длину более одного символа, то следующий символ в ней становится новым первым символом, а старый первый символ становится последним в строкеs
. Если первый символ полученной строки равен '0', то он удаляется из строкиs
. - В основной функции
Mul
также создается временная строкаtmp
, которая содержит строку из цифр от 0 до 9. Эта строка добавляется к результату умножения. - В функции
Xy
сравниваются строки X и Y. Если длина строки X больше длины строки Y, то функция возвращает False. Если длина строки X меньше длины строки Y, то функция возвращает True. Если строки равны, то функция сравнивает их символы по порядку. Если символ в строке X меньше соответствующего символа в строке Y, то функция возвращает False. Если все символы равны, то функция возвращает True. - В основной части программы сначала считываются строки a, b и c. Затем выводятся результаты умножения a на b и c на b.
- После этого выводится сообщение
Меньшее произведение:
и сравниваются произведения в различных комбинациях. Если произведение 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 - это два меньших произведения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д