Baze de numerație și conversii în C++
Convertește numere între baza 10 și baze de la 2 la 10 în C++. Înțelege valoarea pozițională, ordinea resturilor și tratarea corectă a lui zero.
În acest material
În baza 10 folosim cifrele de la 0 la 9. În baza 2 folosim doar 0 și 1, iar în baza 8 cifrele de la 0 la 7. Valoarea unei cifre depinde atât de simbol, cât și de poziția sa în număr.
Lecția pornește de la prelucrarea cifrelor. Vei converti un număr natural din baza 10 într-o bază între 2 și 10 și vei face conversia inversă pentru un șir de cifre valid.
Valoarea pozițională
Numărul 1203 în baza 4 înseamnă 1 * 4 * 4 * 4 + 2 * 4 * 4 + 0 * 4 + 3, adică 99 în baza 10. Pozițiile, de la dreapta la stânga, au ponderile 1, 4, 16, 64.
Baza trebuie precizată: textul 10 reprezintă zece în baza 10, doi în baza 2 și opt în baza 8. Într-o bază b, cifrele sunt între zero și b - 1. Astfel, 102 nu este o scriere validă în baza 2.
Din baza 10 într-o bază b
Împărțim repetat la bază și păstrăm resturile. Pentru 13 în baza 2: 13 / 2 dă câtul 6 și restul 1; 6 / 2 dă 3 și restul 0; apoi resturile sunt 1 și 1. Citite în ordine inversă, ele formează 1101.
Programul citește n și b, cu 0 <= n <= 1000000000 și 2 <= b <= 10.
#include <iostream>
#include <string>
int main() {
long long n = 0;
int b = 0;
std::cin >> n >> b;
std::string cifre;
do {
int rest = static_cast<int>(n % b);
cifre += static_cast<char>('0' + rest);
n /= b;
} while (n > 0);
for (int i = static_cast<int>(cifre.size()) - 1; i >= 0; --i) {
std::cout << cifre[i];
}
std::cout << '\n';
return 0;
}
std::string păstrează aici textul cu resturile. Operatorul += adaugă un caracter la sfârșit, size() arată câte caractere există, iar cifre[i] accesează caracterul de pe poziția i, numerotată de la zero. Pentru cifrele 0 până la 9, expresia '0' + rest permite obținerea caracterului corespunzător.
Resturile sunt memorate de la cifra cea mai puțin semnificativă spre cea mai semnificativă. Bucla finală le afișează de la sfârșit spre început. Conversia dimensiunii la int permite contorului să ajungă la -1; dimensiunea este mică în limitele date.
Pentru zero, do while adaugă o cifră zero și rezultatul este 0, nu un text gol. Pentru 45 2, programul afișează 101101.
Resturile se obțin de la dreapta la stânga; rezultatul se citește în ordine inversă.
Din baza b în baza 10
Citind cifrele de la stânga la dreapta, actualizăm valoarea prin valoare = valoare * b + cifra. Nu trebuie să calculăm separat puterile bazei.
#include <iostream>
#include <string>
int main() {
std::string text;
int b = 0;
std::cin >> text >> b;
long long valoare = 0;
for (char simbol : text) {
int cifra = simbol - '0';
valoare = valoare * b + cifra;
}
std::cout << valoare << '\n';
return 0;
}
Intrarea conține un text de 1 până la 9 cifre, apoi baza între 2 și 10. Enunțul garantează că fiecare cifră este validă pentru bază. Forma for (char simbol : text) parcurge pe rând fiecare caracter al textului.
Pentru 1203 4, valoarea devine succesiv 1, 6, 24, 99. Pentru 00101 2, rezultatul este 5: zerourile din față nu schimbă valoarea numărului. Limita de nouă cifre și baza cel mult 10 asigură că rezultatul și calculele intermediare încap în tipul ales.
Greșeli frecvente și cost
Nu afișa direct resturile în ordinea extragerii: ai inversa cifrele. Nu folosi un număr întreg pentru a memora textul conversiei; ai limita artificial reprezentarea și ai pierde zerourile inițiale la citire.
Exemplele nu validează intrări arbitrare. Dacă textul poate conține cifre invalide sau baza poate fi în afara intervalului, adaugă verificări înaintea conversiei. Pentru baze mai mari de 10 este necesară o convenție suplimentară, de exemplu litere pentru cifrele 10 până la 15 în baza 16.
Dacă reprezentarea are d cifre, fiecare conversie face O(d) pași. Prima memorează O(d) caractere, iar a doua folosește O(1) memorie suplimentară în afara textului de intrare.
Exersează
- Scrie
10din baza 10 în baza 2. - Ce valoare are
1011în baza 2? - Este
38o scriere validă în baza 8? - Ce afișează conversia din baza 10 pentru
0 7?
Răspunsuri: 1010; valoarea 11; nu, cifra 8 nu există în baza 8; rezultatul este 0.
Revino la cuprinsul capitolului sau continuă cu declararea și parcurgerea vectorilor.
Întrebări frecvente
Cum transform un număr din baza zece într-o altă bază?
Împarți repetat la baza dorită și păstrezi resturile. Ele apar de la cifra cea mai puțin semnificativă, deci ordinea trebuie inversată pentru afișare.
Cum transform cifrele unei baze în valoare numerică?
Parcurgi cifrele de la stânga la dreapta și actualizezi rezultatul prin rezultat=rezultat*baza+cifra. Fiecare cifră trebuie să fie validă în baza aleasă.
Ce valori poate avea o cifră în baza b?
Valorile sunt de la zero la b-1. Pentru baze peste zece se folosesc de obicei simboluri suplimentare, de exemplu litere, după o convenție explicită.
Cum reprezint numărul zero?
Scrierea lui zero trebuie să conțină cifra zero. Împărțirea repetată într-o buclă care pornește numai pentru valori pozitive ar produce altfel un rezultat gol.
Conversia elimină riscul de depășire numerică?
Nu. Valoarea numerică rămâne aceeași, iar acumularea rezultatului poate depăși tipul folosit. Verifică limitele înainte de înmulțire și adunare.
Un pas mai departe
Se încarcă progresul…