Re: число -> стpока

From
Andrew Ezhguroff ()
To
Oleg Prizov
Date
2002-12-02T01:49:58Z
Area
RU.ALGORITHMS
From: "Andrew Ezhguroff" <eandr@com2com.ru>

Привет! "Oleg Prizov" <Oleg.Prizov@p133.f150.n469.z2.fidonet.org>
сообщил(а):

 OP> Есть целое положительное большое число, не пpевышающее 2^2048,
 OP> записанное в массиве А вида
 OP> var A:array[1..2048] of byte
 OP> Искомое число pавно А[1]+A[2]*2^8+A[3]*2^16+...+a[1024]*2^(8*2047)
 OP> Как можно его пеpевести в удобночитаемый вид и вывестм на стандаpтный
 OP> вывод (экpан) в десятичной системе счисления? Т.е. если A[1]=56,
 OP> a[2]=78, a[3]=a[4]=...=a[2048]=0, то на экpан необходимо вывести 20024.

Например, вот так (работоспособность кода не проверялась):

procedure OutVal(A: array[1..2048] of byte);
  var BufStr: array [1..5000] of char;
      IdxStr: integer;
      Tmp   : integer;
      FlgNul: boolean;
      i     : integer;
begin
  IdxStr:=5001;
  repeat
    Tmp   :=   0;
    FlgNul:=true;
    for i:=2048 downto 1 do begin
      Tmp:=Tmp*256+A[i];
      A[i]:=Tmp div 10;
      Tmp :=Tmp mod 10;
      FlgNul:=FlgNul and (A[i]=0);
    end;
    IdxStr:=IdxStr-1;
    BufStr[IdxStr]:=Tmp+'0';
  until FlgNul;
  for i:=IdxStr to 5000 do
    write(BufStr[i]);
  writeln;
end;

1. Предполагается, что byte - беззнаковый тип.

2. Алгоритм можно существенно ускорить, если на каждом проходе учитывать
первый ненулевой байт. Например, так:

procedure OutVal(A: array[1..2048] of byte);
  var BufStr: array [1..5000] of char;
      IdxStr: integer;
      Tmp   : integer;
      IdxVal: integer;
      BegVal: integer;
      i     : integer;
begin
  IdxStr:=5001;
  IdxVal:=2048;
  repeat
    Tmp   :=   0;
    FlgNul:=true;
    BegVal:=IdxVal;
    IdxVal:=0;
    for i:=BegVal downto 1 do begin
      Tmp:=Tmp*256+A[i];
      A[i]:=Tmp div 10;
      Tmp :=Tmp mod 10;
      if (IdxVal=0) and (A[i]<>0) then
        IdxVal:=i;
    end;
    IdxStr:=IdxStr-1;
    BufStr[IdxStr]:=Tmp+'0';
  until IdxVal=0;
  for i:=IdxStr to 5000 do
    write(BufStr[i]);
  writeln;
end;

С уважением, Андрей.


-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)