Jump to content

[C++] Conversii - Dintr-o baza in alta


Andreigl
 Share

Recommended Posts

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)
	{
		Rest = Numar % 10;
		Numar /= 10;
		Format = Format + Rest * P;
		P *= Baza_1;
	}

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

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

	return 0;
}

 

Edited by shanker'
Link to comment
Share on other sites

Se pare că am uitat și de convertirea în bază 16, dar este asemănătoare.

Aveți mai jos un exemplu pentru problema următoare: https://www.pbinfo.ro/?pagina=probleme&id=3017

 

#include <stdio.h>

void binoct(long long int Numar, int Divide)
{
    int array[1005], size = 0;

    while (Numar != 0)
    {
        array[size++] = Numar % Divide;
        Numar /= Divide;
    }

    for (int i=(size-1); i>=0; i--)
        printf("%d", array[i]);
}

void hex(long long int Numar)
{
    char caracters[100];
    int size = 0, Rest;

    while (Numar != 0)
    {
        Rest = Numar % 16;
        Numar /= 16;

        if (Rest <= 9)
            caracters[size++] = (char)(Rest + 48);
        else caracters[size++] = (char)(Rest + 55);
    }

    for (int i=(size-1); i>=0; i--)
        printf("%c", caracters[i]);
}

int main()
{
    char C;
    scanf("%s", &C);

    long long int N;
    scanf("%lli", &N);

    if (C == 'b')
        binoct(N, 2);
    else if (C == 'o')  
        binoct(N, 8);  
    else
        hex(N);
	
    return 0;
}

 

Pur și simplu am stocat fiecare număr ce forma noul număr din baza 10 în baza nouă, urmând să-l afișăm.

Edited by shanker'
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

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.