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