Clasa a IX-a · Baze de numerațieRead in English

Conversia între două baze oarecare în C++

În engleză: Converting between any two bases

O(n)C++1744 de linii2 exemple

Ideea

Trecem prin baza 10: întâi transformăm numărul din baza b1 în baza 10 (schema lui Horner), apoi din baza 10 în baza b2 (împărțiri repetate). Se citesc numărul (ca text), b1 și b2, cu 2 <= b1, b2 <= 16.

Descrierea în engleză

We go through base 10: first we convert the number from base b1 to base 10 (Horner's scheme), then from base 10 to base b2 (repeated division). The number (as text), b1 and b2 are read, with 2 <= b1, b2 <= 16.

Complexitate
O(k1 + k2), unde k1, k2 sunt numerele de cifre în cele două baze
Clasa
Clasa a IX-a (Grade 9)

Exemple

Exemplul 1

Intrare

FF 16 2

Ieșire așteptată

11111111
Exemplul 2

Intrare

1202 3 5

Ieșire așteptată

142

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

conversie-intre-doua-baze.cpp
/*
 * Titlu: Conversia între două baze oarecare
 * Clasa: 9
 * Capitol: Baze de numerație
 * Descriere: Trecem prin baza 10: întâi transformăm numărul din baza b1 în
 *            baza 10 (schema lui Horner), apoi din baza 10 în baza b2 (împărțiri
 *            repetate). Se citesc numărul (ca text), b1 și b2, cu 2 <= b1, b2 <= 16.
 * Complexitate: O(k1 + k2), unde k1, k2 sunt numerele de cifre în cele două baze
 *
 * Exemplu
 * Intrare: FF 16 2
 * Ieșire: 11111111
 *
 * Exemplu
 * Intrare: 1202 3 5
 * Ieșire: 142
 */
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    int b1, b2;
    const string CIFRE = "0123456789ABCDEF";
    cin >> s >> b1 >> b2;
    long long n = 0;
    for (int i = 0; i < (int)s.size(); i++)
    {
        int cifra = (int)CIFRE.find(s[i]);
        n = n * b1 + cifra;
    }
    string rez = "";
    do
    {
        rez = CIFRE[n % b2] + rez;
        n = n / b2;
    }
    while (n > 0);
    cout << rez << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.