Program doi_la_puterea_n;
uses crt;

     function div10(var a:string; var nb:word):char;
     {aceasta functie imparte numarul continut in a la 10 si intoarce restul acestei impartiri}
     var n, i: word;
     begin
          n:=0;
          i:=1;
          while (i<=nb) do begin {iteratia magica a impartiri!}
     {restul de la impartirea precedenta se plaseaza in byte-ul superior, iar urmatorul byte din shir in byte-ul inferior al n}
               n:=n shl 8 + ord(a[i]);
     {in loc de byte-ul luat din shir de pe pozitia i se intoarce catul impartiri la 10}
               a[i]:=chr(n div 10);
     {obtinem si restul impartiri lui n la 10, fie pentru a-l intoarce ca rezultat, fie pentru urmatoarea iteratie}
               n:=n mod 10;
     {trecem la urmatorul byte din shirul a}
               inc(i);
          end;                    {sfarsitul magiei}
     {daca dupa impartire primul byte din a devine #0, el se exclude din shir}
          if(a[1]=#0)then begin
             dec(nb);
             delete(a,1,1);
          end;
          div10:=chr(n+48); {se intoarce caracterul de corespunde valori aflate in n - restul impartirii la 10 a shirului}
     end;


function doiLaN(n:word):string;
{n trebuie sa fie cuprins intre 0 si ~1000, altfel numarul zecimal nu incape intr-un string standart de 255 caractere}
var r, a: string;
    i, nb: word;
begin
     doiLaN:='';
     r := '';          {vom obtine cifrele zecimale aici}
     a := #1;          {va contine numarul 2 la puterea n}
     nb:= n div 8 + 1; {nr. de bytes pentru a}
     i:=1;
     while(i<nb)do begin
           a:=a+#0;
           inc(i);
     end;
     a[1]:=chr(1 shl (n-(nb-1)*8)); {acum sirul de bitsi a contine 2^n (doi la puterea n)}
     while(nb<>0)do r:=div10(a,nb)+r;
     doiLaN:=r;
end;


var n:word;
begin
     clrscr;
     n:=200;
     writeln('2^',n,' = ',doiLaN(n));
     readkey;
end.