Informatică, întrebare adresată de davidalexandru9, 9 ani în urmă

Cerința
Să se transforme numărul dat de profesoară în baza 16.

Date de intrare
Fișierul de intrare hex.in conține pe prima linie numărul b, scris în baza 2.

Date de ieșire
Fișierul de ieșire hex.out va conține pe prima linie numărul x, reprezentând numărul b scris în baza 16.

Restricții și precizări
1 ≤ lungimea numărului dat ≤ 10000
Cifrele în baza 16 sunt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Pentru 40% din teste, 1 ≤ lungimea numărului ≤ 20
Dacă îl ajutaţi pe Andino să rezolve problema, el vă va răsplăti cu 100 de puncte.



Exemplu
hex.in

1001010
hex.out

4A

//1300 - in C++


Dennord: Stii citirea din stdio si functii din cstring?
davidalexandru9: nu
davidalexandru9: dar nu conteaza ce cod e, ma interezeaza sa fie bine
davidalexandru9: cstring stiu

Răspunsuri la întrebare

Răspuns de Dennord
1
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("hex.in");
ofstream g("hex.out");
int n,k;
char s[10005],hexa[10005];
int main()
{
    gets(s+1); n=strlen(s+1);
    int S=0;
    for (int i=1;i<=n;i++)
    {       
        if (s[i]=='1') S+=1<<((n-i)%4);
        if ((n-i)%4==0)
        {
            if (S<=9) hexa[++k]=S+'0';
            else hexa[++k]='F'-(15-S);
            S=0;
        }
    }
    puts(hexa+1);
    return 0;
}
Problema ia 100 de puncte.

Dennord: Am vrut sa zic codul*. Trebuie sa-ti dai seama ca 16 este 2^4. Daca iei de la final la inceput nr in baza 2 (spre ex: 100011), o sa iei bucati de cate 4 doar. Pe tine te intereseaza doar cand dai de 1 in baza 2. Suma aia poti sa o scrii ca (1+2)+2^4(2)=3+16*2, asta in baza 16 este 23. Alt exemplu: 111111111. Transformarea ar fi 2^0(1+2+4+8)+2^4(1+2+4+8)+2^8(1)=15+16*15+16^2 care in baza 16 inseamna 1FF. Smecheria e sa iei bucati de cate 4 si sa-ti dai seama ca 2^4 e 16.
Dennord: Dar aici in cod eu am luat de la inceput la final, pentru a afisa mai usor la final (direct puts(hexa+1)). Si am ajustat in cod dupa cum vezi (n-i)... Imi spui daca nu intelegi, problema e cam greuta.
davidalexandru9: 0 puncte am primit doar
Dennord: Ciudat, eu am luat 100, stai sa vad
Dennord: Aaah.. Asa e, scuza-ma, functiile de le-am folosit mergeau pt cstdio, eu asa am avut in cod :P.
Dennord: Daca poate cineva sa stearga raspunsul asta ca sa-l postez pe cel corect...
Dennord: Of, pana sterge...sa stergi linia cu ifstream si ofstream si sa pui asta inainte de gets(s+1);
freopen("hex.in","r",stdin);
freopen("hex.out","w",stdout);
davidalexandru9: am inlocuit si am primit
davidalexandru9: multumesc mult
Alte întrebări interesante