Подпрограммы и Строки: длинная арифметика, умножение - 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 - это два меньших произведения.