Программа сложения и вычитания больших чисел — Pascal(Паскаль)

program PascalGuru;

{ сложение + вычитание БОЛЬШИХ чисел в формате STRING }

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;

{ --- функция вычитания --- }
function minus(s1, s2: string): string;
var
  i, len, c, x: integer;
  a, b: array [1 .. 1000] of integer;
  rez: string;
begin
  c := 0;
  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('-');
    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;
  rez := '';
  for i := len downto 1 do
  begin
    str(a[i], s1);
    rez := rez + s1;
  end;
  minus := rez;
end;
{ --- конец функции вычитания --- }

{ функция сложения }
function plus(s1, s2: string): string;
var
  a, b: array [1 .. 100] of integer;
  len, i, c: integer;
  rez: string;
begin
  c := 0;
  len := length(s1); { разбиение строк в елементы массивов }
  for i := 1 to len do
    a[len - i + 1] := Ord(s1[i]) - 48;
  len := length(s2);
  for i := 1 to len do
    b[len - i + 1] := Ord(s2[i]) - 48;

  if length(s1) > length(s2) then
    len := length(s1)
  else
    len := length(s2);
  for i := 1 to len do
  begin
    c := c + a[i] + b[i];
    { переменная c будет в дальнейшем использоваться для переноса числа в следующия ряд }
    a[i] := c mod 10; { результат сложения запишем в массив а }
    c := c div 10;
  end;
  if c > 0 then
  begin
    len := len + 1;
    a[len] := c;
  end;
  rez := '';
  for i := len downto 1 do
  begin
    str(a[i], s1);
    rez := rez + s1;
  end;
  plus := rez;
end;
{ --- конец функции сложения --- }

var
  c1, c2: string;
  znak: char;

begin

  writeln(plus('154527452243563888500', '100000020'));
  writeln(minus('526', '126'));

end.

Leave a Comment

38 + = 48