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
și36
20%
din teste va avea baza mai mică sau egală cu10
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
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema cifrab:
#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;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #3116 cifrab
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3116 cifrab de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!