Clasa a IX-a · Baze de numerațieRead in English
Conversia între două baze oarecare în C++
În engleză: Converting between any two bases
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)
- Capitol
- Baze de numerație
Exemple
Intrare
FF 16 2
Ieșire așteptată
11111111
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.
/*
* 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.