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

Cerința
Se dă un număr n scris în baza 2. Să se afișeze valoarea acestuia în baza 4.

Date de intrare
Programul citește de la tastatură scrierea în baza 2 a numărului n.

Date de ieșire
Programul va afișa pe ecran scrierea în baza 4 a numărului n.

Restricții și precizări
n are cel mult 100 de cifre în baza 2

Exemplu
Intrare

100011
Ieșire

203
Explicație
100011(2) este scrierea binară a numărului 35(10) . Numărul 35 trecut în baza 4 are scrierea 203(4)

Răspunsuri la întrebare

Răspuns de blindseeker90
5
Stii ca 4=2*2. Deci ceea ce iti trebuie sa reprezinti printr-o cifra in baza 4 iti trebuie doua cifre in baza 2.
Atunci, numarul tau 100011 poate fi scris: 10 00 11, Dar stim ca fiecare grup de doua cifre reprezinta un numar in baza 4, si il scrie folosindu-ne de valaorea lui in baza 2
10=2*0+1=2
00=2*0+0=0
11=2*1+1=3
Deci la sfarsit 100011 devine 203 in baza 4. In cazul in care ai un numar de lungime impara, pur si simplu adauga un zero in fata sirului
De exemplu daca ai 10101(care este 21) ii punem un zero in fata si avem:
010101-01 01 01- 111, si intr-adevar 111 in baza 4 este 4^2+4+1=16+4+1=21
Daca te uiti pe relatia pe care ti-am dat-o la problema anterioara, o sa iti dai seama rapid cum iese asa.

Aici este codul

#include <iostream>
#include <stdlib.h>//itoa
#include <cmath>
#include <cstring>//string
using namespace std;

//functie care transforma caracterul "1" in cifra "1"
//scad din valoarea caracterului valoarea din tabelul lui ascii a lui 0
//diferenta imi da numarul respectiv
//vezi codul ascii de la numarul 48
int char_to_int(char c){
    return c-'0';
}

int main(){
    int i,d,d1,d2;
   //folosesc string pentru ca numarul binar poate incepe cu 0
  // sirul t va fi cel in care pastrez valoarea finala a numarului in baza 4
    string s,t="";
   //sir de 2 caractere care sa pastreze cele 2 cifre binare
    char part [2];
    cin>>s;
    i=0;
   //cum am spus, daca are lungime impara, pui 0 in fata
   //ca sa ai 2 cate 2 cifre binare
    if(s.length()%2==1){
        s="0"+s;
    }
   
   
    while(i<s.length()){
         //faci operatia de transformare in intregi si calculezi cat da cifra in baza 4
        d1=char_to_int(s[i]);
        d2=char_to_int(s[i+1]);
        d=2*d1+d2;
       //transformi acea cifra inapoi in caracter cu itoa-10 este baza scrisa
        itoa(d,part,10);
       //atasezi la sirul care este initial gol pana cand termini de citit sirul binar
        t.append(part);
        i+=2;           
    }
    cout<<t;
   
}



artur99: "folosesc string pentru ca numarul binar poate incepe cu 0"
artur99: Pai la un numar binar, 0-urile din fata sunt optionale, adica (00100)2 == (100)2... Cred ca voiai sa zici ca folosesti string ptc sirul are max 100 de caractere
blindseeker90: Cerinta este sa transformi din baza 2 in baza 4. Ceea ce vrea lstefan era sa transforme din baza 2 in baza 10 si apoi din baza 10 in baza 4. Eu i-am arata alta metoda. Baza 4 este o putere a lui 2, deci iti trebuie 2 cifre binare cuplate ca sa dea un numar scris in baza 4.. De aceea 100011: 10 00 11: 203, Problema ar fi sa ai un numar binar de forma 101, cand ai numar impar de cifre binare si nu poti grupa doi cate doi
artur99: aa, atunci asa o fi :D
blindseeker90: De exemplu daca ai 101: nu poti grupa...dar 101 poate fi scris si ca 0101, asa ca din nou: 0101: 01 01: devine 11 in baza 4. Deci ai nevoie de ceva care sa inceapa cu 0 in anumite cazuri si integer nu o sa il inregistreze pe acel zero. Sigur, puteam sa pun conditie si cu int, dar am preferat asa ca sa arat clar asocierea de cate 2 cifre binare pentru o cifra in baza 4
artur99: Da, da m-am prins... Eram nedumerit doar de partea cu "folosesc string pentru ca numarul binar poate incepe cu 0" :))))
Alte întrebări interesante