Pascal - Сложение и умножение целых чисел любой размерности представленных в виде строк

Пришлось поработать с TurboPascal в очередной раз, под DOS. Была острая необходимость преобразовывать 8 байтовое шестнадцатиричное число в десятичное. Разумеется стандартными средствами, обычного DOS-ового Pascal-я такое решить в лоб нельзя. Ну нет в нем переменных способных уместить такой объём!

Для этих целей были написаны пара функций, топорно очень. Но работают. :)

Первая суммирует два десятичных числа представленных в виде строки, вторая умножает два десятичных числа представленных в виде строки.

1. Сложение (На входе 2 числа в виде строк, на выходе сумма этих чисел в виде строки)
function SumStr(in_1:string; in_2:string):string;
    var len_1, col_1,col_2,col_0,col_er,pont_1:integer;
        res_1, col_s:string;

  begin

  while (length(in_1)<>length(in_2)) do
    begin
      if length(in_1)>length(in_2) then
        in_2:='0'+in_2
          else
            in_1:='0'+in_1;
    end;

    res_1:='';

    pont_1:=0;
    for len_1:=length(in_1) downto 1 do
      begin
        val(in_1[len_1],col_1,col_er);
        val(in_2[len_1],col_2,col_er);
        col_0:=col_1+col_2+pont_1;
        pont_1:=col_0 div 10;
        col_0 := col_0 mod 10;
        str(col_0,col_s);
        res_1:=col_s+res_1;
      end;

      if pont_1>0 then
        begin
          str(pont_1,col_s);
          res_1:=col_s+res_1;
        end;

        SumStr:=res_1;

  end;


2. Умножение (На входе два числа в виде строк, на выходе произведение этих чисел, тоже в виде строки. Данная функция, использует предыдущую функцию сложения, для своей работы.)
function MultStr(in_1:string; in_2:string):string;
  var mult_pos, mult_res:string;
     len_1, len_2, col_1,col_2,col_0,col_er,pont_1, col_r:integer;
        res_1, col_s:string;

  begin

    while (length(in_1)<>length(in_2)) do
    begin
      if length(in_1)>length(in_2) then
        in_2:='0'+in_2
          else
            in_1:='0'+in_1;
    end;



    res_1:='';
    mult_res:='0';
    mult_pos:='0';
    col_r:=0;

    for len_2:=length(in_2) downto 1 do
    begin

    pont_1:=0;
    for len_1:=length(in_1) downto 1 do
      begin
        val(in_1[len_1],col_1,col_er);
        val(in_2[len_2],col_2,col_er);
        col_0:=col_1*col_2+pont_1;
        pont_1:=col_0 div 10;
        col_0 := col_0 mod 10;
        str(col_0,col_s);
        res_1:=col_s+res_1;
      end;

      if pont_1>0 then
        begin
          str(pont_1,col_s);
          res_1:=col_s+res_1;
        end;

      mult_res:=SumStr(res_1,mult_res);

      res_1:='';

      for col_r:=length(in_2) downto len_2 do res_1:='0'+res_1;

     end;


     MultStr:=mult_res;


  end;


Вот, и всё. перевод из 16-ичной в 10-ную, реализовать на основе этих двух функций вообще не проблема.

Вот, алгоритм:

F45ED23C16 = (15·16^7)+(4·16^6)+(5·16^5)+(14·16^4)+(13·16^3)+(2·16^2)+(3·16^1)+(12·16^0) = 409985490810


P.S. Всё это, на случай, если когда нибудь самому понадобится, или для общественности. :)

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.