Длинная арифметика. Вычитание двух чисел

Часто бывает, когда нужно выполнить операцию вычитания одного числа из другого, которые слишком велики для стандартных типов переменных в языках программирования. Тогда на помощь приходят алгоритмы из так называемой «длинной арифметики»
Ниже подан алгоритм вычитания двух длинных чисел.
Числа для вычитания находятся в файле «Input.txt»

Материал взят тут

 
Function CompLong(s1,s2:string):integer; {функция CompLong сравнивает две строки как большие числа}
var
   a,len1,len2,i:integer;
   b:boolean;
begin
   a:=0;
   b:=true;
   len1:=length(s1);
   len2:=length(s2);
   if len1>len2 then begin a:= 1; b:=false; end;
   if len1<len2 then begin a:=-1; b:=false; end;
   if b then
   for i:=1 to len1 do 
    begin
      if Ord(s1[i])-48>Ord(s2[i])-48 then begin a:= 1; break; end;
      if s1[i]<s2[i] then begin a:=-1; break; end;
    end;
   CompLong:=a;
end;

var
   s1,s2:string;
   i,len,c,x:integer;
   a,b:array[1..1000] of integer;// количество цифр в числах
   f1,f2:text;
begin
   Assign(f1,'INPUT.TXT'); Reset(f1);
   Assign(f2,'OUTPUT.TXT'); ReWrite(f2);
   ReadLn(f1,s1); c:=0;
   ReadLn(f1,s2);
   close(f1);
   len:=length(s2);
   for i:=1 to len do
      b[len-i+1]:=Ord(s2[i])-48;
   len:=length(s1);
   
   for i:=1 to len do
      a[len-i+1]:=Ord(s1[i])-48;
   if Complong(s1,s2)<0 then begin
      Write(f2,'-');
      len:=length(s2);
      for i:=1 to len do begin
         x:=a[i];
         a[i]:=b[i];
         b[i]:=x;
      end;
   end;
   for i:=1 to len do
    begin
      c:=c+a[i]-b[i]+10;
      a[i]:= c mod 10;                       {результат будет храниться в массиве a}
      if c < 10 then c:=-1 else c:=0;
    end;
   while (a[len]=0) and (len>1) do len:=len-1;
   for i:=len downto 1 do {вывод результата в файл}
      Write(f2,a[i]);
   close(f2)
end.

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии