# PBinfo #3116 – cifrab – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

cifrab
Alexandra e pasionată de baze de numerație. Ea vrea sa calculeze cifra de control a unui număr în cea mai mică bază de numerație în care poate fi reprezentat acel număr. Se numește cifră de control a unui număr, cifra care se obține prin adunări repetate a cifrelor numărului până obținem o singură cifră. Exemplu: 1294 în baza 10 are suma cifrelor 16 care adunate din nou dau cifra de control 7. Dar Alexandra are la dispoziție un număr care poate conține nu doar cifre, ci și litere mari ale alfabetului. A înseamnă cifra 10, B cifra 11, …, Z cifra 35. Deci baza maximă posibilă este 36.

Cerința
Dându-se un număr printr-un șir de caractere format doar din litere mari și cifre, să se determine cea mai mică bază de numerație posibilă, precum și cifra de control a acestui număr în acea bază.

Date de intrare
Fișierul de intrare cifrab.in conţine un șir de caractere format doar din litere mari și cifre, acest șir reprezentând numărul.

Date de ieșire
Fișierul de ieșire cifrab.out va conţine pe prima linie cea mai mică bază, iar pe a doua linie cifra de control a numărului reprezentat în baza determinată.

Restricții și precizări

numărul are maximum 100 000 de cifre
baza este cuprinsă între 2 și 36
20% din teste va avea baza  mai mică sau egală cu 10

Exemplu:
cifrab.in

349
cifrab.out

10
7
Explicație
Cea mai mică bază este 10 și calculând cifra de control în baza 10 se obțin pe rând valorile 349, 16, 7.

## Cod sursă C++

```cpp
#include <fstream>
#define N 1000001
using namespace std;
ifstream fin("cifrab.in");
ofstream fout("cifrab.out");
char c;
 int A[N];
int  Mod(int  A[N], int b, int X)
{ int i;
  int R=0;
  for (i=A[0];i;i--)
    R=(b*R+A[i])%X;
  return R;
}
void citire( int &b, int A[N])
{
    int max=0,n=0;
    while(fin>>c)
    {
        if(c>='A' && c<='Z'){ A[++n]=int(c-'A'+10); A[0]++;}
        else { A[++n]=int(c-'0'); A[0]++;}
        if(max<A[n]) max=A[n];
    }
    b=(max?max+1:2);
}
int main()
{
    int n,b,S=0,x;
    citire(b, A);
    fout<<b<<"\n";
    x=Mod(A,b,b-1);
    char bc=(x<10?x+'0':x-10+'A');
    if (x==0) fout<<char(b-1<10?b-1+'0':b-1-10+'A');
    else fout<<bc;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3116)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3116/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3116/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
