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
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;
}
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"
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Informatică,
9 ani în urmă
Limba română,
9 ani în urmă
Franceza,
9 ani în urmă
Limba română,
9 ani în urmă