Jump to content

Sezonul 2 de Maraton a început. Detalii aici

Cartea Recordurilor pe sa-mp a revenit. Mai multe detalii aici

Sign in to follow this  
shanker'

Conversii - Dintr-o baza in alta

Recommended Posts

Nu găsii un tutorial cap coadă care să-mi explice pe cât de simplu se poate, din păcate.

Sincer, nu știu la ce mă ajuta pe mine în viață șă știu să convertesc un număr dintr-o bază în alta, asta fiind limbajul natural al unui computer (sistemul binar), însă dacă tot învățai la cursuri așa ceva, pt cine-i interesat, poate să citească și el acest „tutorial?”.

 

Cum convertim un număr dintr-o bază B într-o bază C?

  • Aducem numărul din baza B în baza 10
  • Aducem numărul din baza 10 în baza C

 

1) Convertirea unui număr din baza B în baza 10

  • Aflăm restul împărțirii numarului la 10
  • Împărțim numarul la 10
  • Formatăm numărul

 

Ce înseamnă a formata un număr?

Să zicem că avem următorul vector populat:

 

int vector[] = {3, 4, 5};

A formata un număr înseamnă a crea un singur număr din N cifre. Dacă o luam din stânga către dreapta, se formează numărul 345. 

Deci cum putem face asta?

 

Folosim următorul algoritm:

int P = 1, Format = 0;

for (int i=0; i<3; i++)
{
    Format = Format * 10 + vector[i];
    P *= 10;
}

Pentru exemplul nostru avem următoarele calcule:

Începând de la variabilele: Format = 0, P = 1;
Vectorul nostru este populat de la 0, deci: vector[0] = 3, vector[1] = 4, vector[2] = 5
de reținut că acesta când o sa fie mai mare ca 2, ce-i după acolada for-ului nu o să se mai citească:

Când i = 0,
  Format = Format * 10 + vector[0];
  ( 0 = 0 * 10 + 3 ) <=> ( 0 = 3 ) <=> (3=3)

Când i = 1,
  Format = Format * 10 + vector[1];
  ( 3 = 3 * 10 + 4) <=> ( 3 = 30 + 4) <=> ( 3 = 34 ) <=> ( 34 = 34)

Când i = 2,
  Format = Format * 10 + vector[2];
  (34 = 34 * 10 + 5) <=> ( 34 = 340 + 5) <=> (345 = 345)

 

Deci acum că știți la ce fac referire când vorbesc de a formata un număr, algoritmul pentru a convertii un număr din baza B în baza 10, trebuie să arate în felul următor:

 

int Numar, Baza;
std::cin >> Numar >> Baza;

int Rest, Format = 0, P = 1;

while (Numar != 0)
{
    Rest = Numar % 10;
    Numar /= 10;
    Format = Format + Rest * P;
    P *= Baza;
}

std::cout << Format;

Doar că, dacă vă uitați atent, am inversat formula de calcul, înmulțind restul cu 10, în cazul nostru baza P și adunând rezultatul de dinainte.

 

Hai s-o luam puțin logic. O să convertim numărul 34 din bază 5 în bază 10.

Avem numărul 34 în baza 5 și vrem să-l convertim în baza 10.
Format = 0, P = 1

Rest = 34 % 10 = 4(10 fiind baza în care vrem să ajungem)
Numar /= 10 (10 fiind baza în care vrem să ajungem)
Format = 0 + 4 * 1 = 4
P *= 5 (5 fiind baza curentă a numărului nostru)

Avem P = 5, Format = 4

Rest = 3 % 10 = 3
Numar /= 10
Format = 4 + 3 * 5 = 4 + 15 = 19

Deci 34 în bază 10 din bază 5 este 19.

 

2) Convertirea unui număr din baza 10 într-o bază oarecare:

  • Aflăm restul împărțirii numărului cu baza la care vrem să ajungem
  • Impărțim numărul cu baza la care vrem să ajungem
  • Formatăm numărul
  • Înmulțim P cu baza la care numărul nostru inițial se afla

 

while (Numar != 0)
{
    Rest = Numar % Baza;
    Numar /= Baza;
    Format = Format + Rest * P;
    P *= 10;
 }

Să luam ca exemplu tot pe 34, convertindu-l din bază 10 în baza binară.

Fie numărul 1000 în bază 2. Acesta ocupă 4 biți. Începând de la dreapta către stânga, avem 2^0, 2^1, 2^2 samd, însă doar pentru cifrele nenule. (Poziția cifrei, însumându-se de la 0, de la dreapta către stânga)

Deci cum în numarul 1000 este doar o cifră nenula, avem 2^3 care este egal cu 8.
Numărul 1111 este egal cu: 2^0 + 2^1 + ... + 2^3 = 15
Numărul 1101 este egal cu: 2^0 + 2^2 + 2^3 = 13

 

Deci acum că știm cele 2 funcții de mai sus, mai rămâne să convertim un număr dintr-o bază oarecare în alta:

 

#include <iostream>

int main()
{
    int Baza_1, Baza_2, Rest;
    long long int Numar,
    	Format = 0, P = 1, aux = 0;

    std::cin >> Numar >> Baza_1 >> Baza_2;

    // Trebuie sa convertim numarul din baza B in baza 10
    while (Numar != 0)
    {
        Rest = Numar % 10;
        Numar /= 10;
        Format = Format + Rest * P;
        P *= Baza_1;
    }

    // Convertim din baza 10 in Baza_2
    P = 1;
    while (Format != 0)
    {
        Rest = Format % Baza_2;
        Format /= Baza_2;
        aux = aux + Rest * P;
        P *= 10;
    }

    std::cout << aux;

    return 0;
}

 

Aceasta fiind funcția de bază pentru schimbarea bazei. În vazul în care avem să convertim un număr dintr-o bază mare într-una mică (cea binară de exemplu), programul o să dea fail deoarece numărul de cifre o să depășească range-ul „long long int”. Ce avem de făcut este să populăm un vector cu fiecare număr obținut.

 

#include <iostream>

int main()
{
    int Baza_1, Baza_2, Rest;
    long long int Numar,
    	Format = 0, P = 1, aux = 0;

    int Vector[100];

    std::cin >> Numar >> Baza_1 >> Baza_2;

    // Trebuie sa convertim numarul din baza B in baza 10
    while (Numar != 0)
    {
        Ultima_Cifra = Numar % 10;
        Numar /= 10;
        Format = Format + Ultima_Cifra * P;
        P *= Baza_1;
    }

    // Convertim din baza 10 in Baza_2
    while (Format != 0)
    {
        Ultima_Cifra = Format % Baza_2;
        Format /= Baza_2;
        Vector[K++] = Ultima_Cifra;
    }

    for (int i=K-1; i>=0; i--)
        std::cout << Vector[i];

    return 0;
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.