RSS

L13. Conversia unui numar din baza B in baza 10

02 Oct

Un numar NB scris in baza B are “cifre” cu valori intre 0 si B-1. Problema noastra este sa determinam ce numar N10 ii corespunde lui NB pentru baza 10.

Pentru aceasta sa observam urmatorul exemplu. Un numar in baza 10, N10=2490 poate fi scris si in forma canonica, adica N10=2*10^3+4*10^2+9*10^1+0*10^0.

Fie NB=4672 scris in baza B=8. Pentru a converti NB in baza 10 trebuie sa il scriem in forma canonica.

N10=4*8^3+6*8^2+7*8^1+2*8^0. Dupa calcule se obtine valoarea N10=2490.

Practic trebuie sa calculam o suma de produse a cifrelor din NB cu puteri ale bazei. Vom folosi algoritmul de prelucrare a cifrelor unui numar (NB).

citeste NB, B;

N10=0;

PB=1;

executa{

     N10=N10+(NB%10)*PB;

     PB=PB*B;

     NB=NB/10;

     }cat timp (NB!=0);

scrie N10;

 
16 Comments

Posted by on 02/10/2012 in C2_1. Algoritmica

 

Tags: ,

16 responses to “L13. Conversia unui numar din baza B in baza 10

  1. Andreea Partenie

    18/04/2014 at 10:39

    Buna ziua. As vrea sa ma ajutati si pe mine cu cateva probleme daca se poate.
    1. Se citeste de la tastatura un numar in baza 4. Sa se verifice daca numarul este corect, daca cifrele corespund. Sa se afiseze frecventa cifrelor sale.
    Multumesc anticipat.

     
  2. mchelariu71

    18/04/2014 at 12:21

    Un numar in baza B are cifre de la 0 la B-1. In consecinta, un numar in baza 4 va avea cifre de la 0 la 3.
    Prima chestiune este corectitudinea numarului. Trebuie sa verific daca fiecare cifra este strict mai mica decat 4. Vom folosi o variabila CORECT, initial 1, care va deveni 0 in cazul in care gasim o neconcordanta. Vom trece de la o cifra la alta prelucrand si stergand ultima cifra, pana cand numarul devine 0.
    Pe de alta parte va trebui sa memorezi numarul de aparitii ale fiecarei cifre. Poti folosi fie cateva variabile c0, c1, c2, c3 fie un vector C[0..9] cu aceeasi semnificatie. Presupunand ca problema s-ar putea complica, ar tb vectorul.

    cin>>n; //citeste n
    c0=c1=c2=c3=0;
    corect=1;
    do{
    ucif=n%10;
    if(ucif==0) c0++;
    else if(ucif==1) c1++;
    else if(ucif==2) c2++;
    else if(ucif==3) c3++;
    else corect=0;
    n=n/10;
    } while (n!=0);
    if (corect ==0) cout <<"numarul este INCORECT"; //scrie, afiseaza
    else {
    cout <<"numarul este CORECT";
    cout<<"cifra "<<0<<" apare de "<< c0<<" ori"<<endl;
    cout<<"cifra "<<1<<" apare de "<< c1<<" ori"<<endl;
    cout<<"cifra "<<2<<" apare de "<< c2<<" ori"<<endl;
    cout<<"cifra "<<3<<" apare de "<< c3<<" ori"<<endl;
    }
    Succes!

     
  3. Andreea Partenie

    18/04/2014 at 15:01

    Eu nu am invatat inca probleme C++.

     
  4. Andreea Ilie

    20/04/2014 at 16:23

    Buna ziua as avrea sa ma ajutati si pe mine cu o problema.
    Se introduce de la tastatura baza de enumaratie K si cifrele unui numar reprezentat in baza K. Sa se verifice daca cifrele sunt corecte pentru baza aleasa si sa se afiseze suma cifrelor de rang par. Exemplu K= 4
    3 -> 1
    0 ->2
    2-> 3
    2 -> 4
    0- > 5
    .
    .
    .
    6

     
  5. Andreea Ilie

    20/04/2014 at 16:24

    Dar daca se poate il algoritm sa imi aratati deoarece nu am invatat in c++

     
  6. mchelariu71

    21/04/2014 at 15:37

    Analiza
    Ca si mai sus, problema este daca cifrele numarului sunt mai mici decat K (pentru a fi un numar scris in baza K). In concluzie trebuie sa prelucrez numarul N, cifra cu cifra. Abia daca numarul este corect dpdv al bazei, are rost sa afisez suma ceruta.
    In privinta sumei, nu se specifica numarul de cifre a lui N. Am putea sa il prelucram inainte si sa aflam numarul de cifre din numar si apoi sa il prelucram iarasi pentru a afla suma. Poate ar fi mai bine sa calculam din prima , in doua variabile diferite S1 si S2, sumele cifrelor, din 2 in 2 si abia la sfarsit, cand vom sti cate cifre sunt, sa putem stabili care dintre sume ne intereseaza.

    Exemple
    Daca N =1971 (are patru cifre = numar par de cifre)=> S1=1+9=10 iar S2=7+1=8. rangul se considera de la stanga la dreapta si atunci suma care ne intereseaza este S1.
    Daca N=12345 (are 5 cifre = numar impar de cifre)=> S1= 5+3+1=9 iar. S2=4+2=6. Suma care ne intereseaza este S2.

    Codul
    citeste N, K;
    S1<-0; S2<-0; nrcif<-0;
    corect<-1;
    executa {
    daca ( n mod 10 > = K) atunci corect<-0;

    //problema sumelor
    nrcif<-nrcif+1;
    //adun ultima cifra (n%10) la S1 sau S2, alternativ
    daca (nrcif %2==1) atunci S1<-S1+N%10;
    altfel S2<-S2+N%10;
    N<-N/10;
    }
    cat timp (N!=0);
    daca (corect==0) atunci afiseaza "INCORECT";
    altfel{
    afiseaza "CORECT";
    daca (nrcif%2==0) //nr par de cifre
    atunci afiseaza S1;
    altfel afiseaza S2;
    }
    😀

    Ar fi de dorit sa parcurgi exemplele intr-un tabel in care sa verifici cum se modifica variabilele din problema. Succes! nu stiu de ce , desi scriu corect, afiseaza cu greseli.

     
  7. Alina

    23/04/2014 at 16:30

    Buna ziua. Am si eu o problema.
    Dar nu am invatat probleme in C++
    Se citesc de la tastatura 2 numere a si b in baza 10 care reprezinta capetele unui interval inchis [a,b]. Sa se afiseze toate numerele din interbalul [a,b] care la transformarea in baza 2 au un numar de cifre egal cu numarul cifrelor de 0.

     
  8. mchelariu71

    01/05/2014 at 17:21

    nu prea e clar enuntul. de unde sunt cifrele de 0 (din transformarea in baza 2 sau din valoarea initiala). numarul de cifre se refera la valoarea initiala (din baza 10)?

     
  9. Alex

    10/05/2014 at 13:42

    Salut, cum ar arata varianta recursiva de la acest program?

     
  10. mchelariu71

    12/05/2014 at 19:27

    ca intot deauna la o fct recursiva trebuie sa te gandesti la cazul limita si cazul general. algoritmul nerecursiv se bazeaza pe “hai sa tocam cifrele lui NB”. Atunci ar trebui ca varianta recursiva sa fie similara cu cea de prelucrare recursiva a cifrelor unui numar natural
    – daca e o cifra , e simplu. am terminat
    daca sunt mai multe cifre apelam recursiv pt nb/10 si prelucram impreuna cu nb%10 (ultima cifra a lui nb)

    Pe de alta parte un numar A scris in baza B este de forma an-1*b^(n-1)+…+a0*b^0 (forma canonica a numarului. rescriu aceasta forma in modul
    (….((an-1*b+an-2)*b+an-3)*b+an-4)……..)*b+10 unde transpare si ideea de recursie
    In consecinta functia este

    unsigned long nbTOn10( unsigned long nb )
    {
    if ( nb < 10 ) return nb;
    else return nbTOn10( nb / 10 )*b+nb%10;
    }
    asta-i

     
  11. Giumbix

    20/01/2015 at 17:38

    Sunt tare curios daca ai verificat algoritmul. Daca nu, iti spun eu, e gresit.Nu prea stiu cum sa explic.Convertesti cu spatele dar nu e buna nici exprimarea asta pentru ca greseala se face la N10 Incearca sa convertesti exemplul tau, N8=4672.

     
  12. mchelariu71

    20/01/2015 at 23:37

    1. te inseli.
    2. “cu spatele ” presupun ca inseamna “de la sfarsit”
    3. poti verifica cu aplicatia “Calculator” din Accesories; Activeaza View- Scientific/Programmer (ceva…) si ai acolo convesii automate in hexa, decimal, octal , binar.
    4. iata codul coresp algoritmului. Si merge. poate e vreo greseala la tine. succes.

    #include
    using namespace std;
    int nb, b;
    long n10,pb;
    int main()
    { //cin>>nb>>b;
    nb=4672;
    b=8;
    n10=0;
    pb=1;
    do
    {n10=n10+pb*(nb%10);
    pb=pb*b;
    nb=nb/10;
    }while(nb>0);
    cout<<n10;
    return 0;
    }

    Ma bucur ca te intereseaza.

     
  13. Mihnea

    21/02/2015 at 19:22

    Buna ziua! De curand am inceput sa stuidez informatica si, prin urmare, am inceput sa lucrez probleme pe site-uri speciale ( pbinfo, infoarena etc ). Un exercitiu ne cere transformarea unui numar N scris in baza B, in baza C. Am observat ca, daca il trec mai intai din baza B in baza 10, iar mai apoi din baza 10 in baza C, primesc un punctaj mai mare decat daca l-as muta direct din baza B in C. Uitandu-ma peste L13 si L14, am incercat sa generalizez un algoritm ( nu sunt sigur daca exprimarea este corecta😀 ) cu scopul de a trece numarul direct din baza B in Ct. Trecand la subiect, as dori sa stiu cum as putea… optimiza urmatorul algoritm sau daca este, cel putin teoretic, corect.

    #include

    using namespace std;

    int main ()
    {
    long long b, c, n, nc, p;
    cin>> n>> b>> c;
    nc = 0;
    p = 1;
    while ( n != 0 )
    {
    nc = nc + p*( n%c );
    p = p * b;
    n = n / c;
    }
    cout<< nc;
    return 0;
    }

     
  14. mchelariu71

    22/02/2015 at 10:09

    1. nu cred ca e corect si asta se poate vgerifica usor executand.
    2. poti verifica cu aplicatia “Calculator” din Accesories; Activeaza View- Scientific/Programmer (ceva…) si ai acolo convesii automate in hexa, decimal, octal , binar.
    3. exista o regula de transformare din baza 2 in alta baza PUTERE A LUI 2.
    exemplu
    n2=1110110111
    daca vorbim de baza 8 vom grupa cate 3 cifre binare (pentru ca 8=2^3; regula se aplica similar si pentru celelalte baze puteri a lui 2)
    n2=1.110.110.111
    n8=1.6.6.7=1667. Corectitudinea se poate verifica usor cu obs de la pct 2.
    Succes!

     
  15. Asterix

    05/04/2015 at 17:16

    Buna, am primit urmatorul enunt:
    sa se scrie un program care folosind clase, realizeaza operatii cu numere in diferite baze de numeratie(2,8,10,16). Se vor efectua operatiile de anudare, scadere,inversul unui numar si patratul unui numar.

    am scris urmatorul algoritm pentru conversia din baza 10 in 2 dar imi afiseaza rezultatul invers, adica in oglinda.

    #include
    using namespace std;

    int main()
    {
    int num;
    int TOTAL;
    cout <> num;
    while(num > 0)
    {
    TOTAL = num % 2;
    num /= 2;
    cout << TOTAL << " ";
    }
    return 0;
    }

    vreau sa stiu cum sa rezolv problema in legatura cu afisarea si daca algoritmul fiecarei conversii de baza poate fi scris dupa exemplul de mai sus.

    multumesc anticipat!

     
  16. mchelariu71

    05/04/2015 at 18:54

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: