

A N E X A   3

Utilizari ale unitatilor B2TOZ si ARITMBIN



{ ============= } PROGRAM CMMDC; { ====================== }
        { Determina cel mai mare divizor comun al numerelor
          m si n. Acestea pot fi date in orice baza intre 2
          si 35 (Z).  Calculele vor fi efectuate in baza 35.
          Rezultatul va fi afisat in baza 10. }
uses B2toZ;
var  m, n, d, i, c, r: string;
begin
  write('Primul numar,      urmat de baza : '); readln(m);
  write('Numarul al doilea, urmat de baza : '); readln(n);
  d := tobaseint(m, 35);
  i := tobaseint(n, 35);
  while i <> '0Z' do begin
    c := divide(d, i);
    r := Copy(c, Pos('Z',c)+1, length(c)-Pos('Z',c));
    d := i;
    i := r;
  end;
  m := tobaseint(m, 10);
  n := tobaseint(n, 10);
  d := tobaseint(d, 10);
  writeln(d, '  =  CMMDC( ', m, ' , ', n, ' )');
end. { CMMDC }



{ =============== } PROGRAM FACT; { ===================== }
        { Afiseaza valorile numarului n!, cu n <= s <= 145.
          Incepand cu  146! sunt  necesare mai  mult de 255
          cifre in baza 10. Daca se lucreaza in baza 35 (Z)
          atunci se poate  ajunge pana la 192!, iar in baza
                                  2 se ajunge doar la 56! }
uses B2toZ;
var  f, n, u: string;   i, s: byte;
begin
  f := '1A;    u := '1A;     n := '0A;
  write('Valoarea maxima s pentru s! = ');     readln(s);
  if s > 145 then s := 145;
  for i := 1 to s do begin
    n := plus(n, u); f := times(f, n); writeln(i:3, ' ! = ', f)
  end 
end. { FACT }



{ ============= } PROGRAM CMMDCAB; { ==================== }
        { Determina cel mai mare divizor comun al numerelor
          m si n, si constantele intregi a si b pentru care
                 d  =  CMMDC(m,n)  =  a*m + b*n.
          Numerele m si n pot fi date in orice baza intre 2
          si 35 (Z).  Calculele  vor fi  efectuate folosind
          reprezentarea in cod complementar pe 125 de biti.
          Rezultatul va fi afisat in baza 10. }
uses B2toZ, AritmBin;
const NrBiti = 125;
var  m, n, d, i, c, r, a, b, u, v, t: string;
begin
  write('Primul numar,      urmat de baza : '); readln(m);
  write('Numarul al doilea, urmat de baza : '); readln(n);
  d := tobaseint(m, 2);            i := tobaseint(n, 2);
  d := deplasari(Copy(d,1,length(d)-1), '0', Nrbiti, 0);
  i := deplasari(Copy(i,1,length(i)-1), '0', Nrbiti, 0);
  a := deplasari('0', '0', Nrbiti, 0);
  b := deplasari('1', '0', Nrbiti, 0);
  u := deplasari('1', '0', Nrbiti, 0);
  v := deplasari('0', '0', Nrbiti, 0);
  while Pos('1',i) <> 0 do begin
    d := deplasari(d, '0', 2*NrBiti, 0);
    c := dividecc(d, i, NrBiti);
    r := Copy(c, NrBiti+2, NrBiti);
    c := Copy(c, 1, NrBiti);
    d := i;
    i := r;
    if Pos('1',r) <> 0 then begin
      t := u;               u := a;
      a := plusfs(t, complement(Copy(
                                   timescc(c, a, NrBiti),
                                 NrBiti+1, NrBiti)),
                               NrBiti);
      t := v; v := b;
      b := plusfs(t, complement(Copy(
                                   timescc(c, b, NrBiti),
                                 NrBiti+1, NrBiti)),
                               NrBiti)
    end
  end;
  m := tobaseint(m, 10);             n := tobaseint(n, 10);
  d := tobaseint(d+'2', 10);         t := a[1] + b[1];
  if a[1] = '1' then a := complement(a);
  if b[1] = '1' then b := complement(b);
  a := tobaseint(a+'2', 10); if t[1] = '1' then a := '-'+a;
  b := tobaseint(b+'2', 10); if t[2] = '1' then b := '-'+b;
  writeln(d, '  =  CMMDC( ', m, ' , ', n, ' )  =  ',
          a, '*', m, ' + ', b, '*', n);
end. { CMMDCAB }

