Bun, hai să vorbim despre unul dintre cele mai fundamentale și utile algoritme din programare: OPERATIILE CU CIFRELE UNUI NUMAR. Nu e doar despre cifre (cuvânt simplu) și descompunere. E despre cum transformi un număr întreg într-o colecție de cifre pe care le poți analiza, modifica și manipula. E un concept atât de esențial încât aproape orice problemă cu numerele începe cu “ia cifrele numărului”.
1. Ce înseamnă “Operații asupra Cifrelor”? “Spargerea Numărului”
Gândește-te la un număr ca la un tren cu vagoane: fiecare vagon este o cifră, iar tu vrei să:
- Numări câte vagoane are (câte cifre)
- Vezi ce e în fiecare vagon (care e fiecare cifră)
- Schimbi ordinea vagoanelor (inversezi numărul)
- Aduni ce e în vagoane (suma cifrelor)
Analogie cu un PIN de telefon:
PIN: 1 9 8 4
- Numărul de cifre: 4
- Suma cifrelor: 1+9+8+4 = 22
- Cifra maximă: 9
- Numărul invers: 4 8 9 1
2. Cum Extragem Cifrele unui Număr? “Diviziunea cu 10”
Secretul: Folosim operațiile % 10 și / 10 pe numere întregi!
#include <iostream>
using namespace std;
int main() {
int numar = 1234;
cout << "Numarul initial: " << numar << endl;
cout << "Extragem cifrele de la dreapta la stanga:\n\n";
while(numar > 0) {
int cifra = numar % 10; // Ia ultima cifră
cout << "Cifra: " << cifra << endl;
numar = numar / 10; // Elimină ultima cifră
cout << "Numar ramas: " << numar << endl;
}
return 0;
}
Ce se întâmplă pas cu pas:
Start: numar = 1234
Pasul 1: cifra = 1234 % 10 = 4, numar = 1234 / 10 = 123
Pasul 2: cifra = 123 % 10 = 3, numar = 123 / 10 = 12
Pasul 3: cifra = 12 % 10 = 2, numar = 12 / 10 = 1
Pasul 4: cifra = 1 % 10 = 1, numar = 1 / 10 = 0 (STOP)
3. Algoritmi Elementari cu Cifre
3.1 Numărul de Cifre
#include <iostream>
using namespace std;
int main() {
int numar = 12345;
int copie = numar;
int contor = 0;
while(copie > 0) {
contor++;
copie = copie / 10; // Elimină o cifră
}
cout << "Numarul " << numar << " are " << contor << " cifre" << endl;
return 0;
}
3.2 Suma Cifrelor
#include <iostream>
using namespace std;
int main() {
int numar = 1234;
int suma = 0;
int copie = numar;
while(copie > 0) {
suma += copie % 10; // Adaugă ultima cifră
copie /= 10; // Elimină ultima cifră
}
cout << "Suma cifrelor lui " << numar << " este: " << suma << endl;
return 0;
}
3.3 Cifra Maximă
#include <iostream>
using namespace std;
int main() {
int numar = 5298;
int maxim = 0;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra > maxim) {
maxim = cifra;
}
copie /= 10;
}
cout << "Cifra maxima din " << numar << " este: " << maxim << endl;
return 0;
}
3.4 Numărul Invers
#include <iostream>
using namespace std;
int main() {
int numar = 1234;
int invers = 0;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
invers = invers * 10 + cifra; // Construiește inversul
copie /= 10;
}
cout << "Inversul lui " << numar << " este: " << invers << endl;
return 0;
}
Cum funcționează inversul:
Start: invers = 0, numar = 1234
Pasul 1: cifra = 4, invers = 0*10 + 4 = 4
Pasul 2: cifra = 3, invers = 4*10 + 3 = 43
Pasul 3: cifra = 2, invers = 43*10 + 2 = 432
Pasul 4: cifra = 1, invers = 432*10 + 1 = 4321
3.5 Verificare Palindrom
#include <iostream>
using namespace std;
int main() {
int numar = 12321;
int invers = 0;
int copie = numar;
// Construiește inversul
while(copie > 0) {
invers = invers * 10 + (copie % 10);
copie /= 10;
}
// Verifică dacă e palindrom
if(numar == invers) {
cout << numar << " este palindrom!" << endl;
} else {
cout << numar << " NU este palindrom!" << endl;
}
return 0;
}
3.6 Numărul de Cifre Pare/Impare
#include <iostream>
using namespace std;
int main() {
int numar = 123456;
int pare = 0, impare = 0;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra % 2 == 0) {
pare++;
} else {
impare++;
}
copie /= 10;
}
cout << "In " << numar << ":\n";
cout << "- Cifre pare: " << pare << endl;
cout << "- Cifre impare: " << impare << endl;
return 0;
}
4. Operații Combinatorii
4.1 Suma cifrelor cu condiție
#include <iostream>
using namespace std;
int main() {
int numar = 52983;
int sumaPare = 0;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra % 2 == 0) { // Dacă e pară
sumaPare += cifra;
}
copie /= 10;
}
cout << "Suma cifrelor pare din " << numar << " este: " << sumaPare << endl;
return 0;
}
4.2 Produsul cifrelor
#include <iostream>
using namespace std;
int main() {
int numar = 234;
int produs = 1;
int copie = numar;
while(copie > 0) {
produs *= (copie % 10); // Înmulțește cu cifra
copie /= 10;
}
cout << "Produsul cifrelor lui " << numar << " este: " << produs << endl;
return 0;
}
4.3 Cifra minimă și maximă în același timp
#include <iostream>
using namespace std;
int main() {
int numar = 52981;
int minim = 9; // Inițializez cu cea mai mare cifră
int maxim = 0; // Inițializez cu cea mai mică cifră
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra < minim) minim = cifra;
if(cifra > maxim) maxim = cifra;
copie /= 10;
}
cout << "In " << numar << ":\n";
cout << "- Cifra minima: " << minim << endl;
cout << "- Cifra maxima: " << maxim << endl;
return 0;
}
5. Transformări Avansate
5.1 Înlocuirea unei cifre
#include <iostream>
using namespace std;
int main() {
int numar = 12343;
int vechi = 3;
int nou = 7;
int rezultat = 0;
int putere = 1;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra == vechi) {
cifra = nou; // Înlocuiește cifra
}
rezultat = cifra * putere + rezultat;
putere *= 10;
copie /= 10;
}
cout << "Numarul " << numar << " cu " << vechi
<< " inlocuit cu " << nou << " devine: " << rezultat << endl;
return 0;
}
5.2 Eliminarea unei cifre
#include <iostream>
using namespace std;
int main() {
int numar = 12343;
int cifraDeEliminat = 3;
int rezultat = 0;
int putere = 1;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
if(cifra != cifraDeEliminat) { // Păstrează doar cifrele diferite
rezultat = cifra * putere + rezultat;
putere *= 10;
}
copie /= 10;
}
cout << "Numarul " << numar << " fara cifra "
<< cifraDeEliminat << " devine: " << rezultat << endl;
return 0;
}
5.3 Sortarea cifrelor (crescător)
#include <iostream>
using namespace std;
int main() {
int numar = 52981;
int rezultat = 0;
// Verifică fiecare cifră de la 0 la 9
for(int cifraCurenta = 0; cifraCurenta <= 9; cifraCurenta++) {
int copie = numar;
while(copie > 0) {
if(copie % 10 == cifraCurenta) {
rezultat = rezultat * 10 + cifraCurenta;
}
copie /= 10;
}
}
cout << "Cifrele lui " << numar << " sortate: " << rezultat << endl;
return 0;
}
6. Probleme Practice
Problema 1: Verifică dacă toate cifrele sunt pare
#include <iostream>
using namespace std;
int main() {
int numar = 2468;
int copie = numar;
bool toatePare = true;
while(copie > 0) {
if((copie % 10) % 2 != 0) { // Dacă cifra e impară
toatePare = false;
break;
}
copie /= 10;
}
if(toatePare) {
cout << numar << " are toate cifrele pare!" << endl;
} else {
cout << numar << " NU are toate cifrele pare!" << endl;
}
return 0;
}
Problema 2: Numără de câte ori apare o cifră
#include <iostream>
using namespace std;
int main() {
int numar = 12342343;
int cifraCautata = 3;
int aparitii = 0;
int copie = numar;
while(copie > 0) {
if(copie % 10 == cifraCautata) {
aparitii++;
}
copie /= 10;
}
cout << "Cifra " << cifraCautata << " apare de "
<< aparitii << " ori in " << numar << endl;
return 0;
}
Problema 3: Cea mai mică și cea mai mare cifră
#include <iostream>
using namespace std;
int main() {
int numar = 52981;
int minim = 9, maxim = 0;
int copie = numar;
while(copie > 0) {
int cifra = copie % 10;
minim = (cifra < minim) ? cifra : minim;
maxim = (cifra > maxim) ? cifra : maxim;
copie /= 10;
}
cout << "In " << numar << ":\n";
cout << "Minim: " << minim << "\nMaxim: " << maxim << endl;
return 0;
}
7. Algoritmul Universal: Schema de Bază
Schema pentru aproape orice operație cu cifre:
int numar = /* numărul tău */;
int copie = numar; // Mereu lucrează pe o copie!
while(copie > 0) {
int cifra = copie % 10; // Ia ultima cifră
// AICI FACI CE VREI CU CIFRA!
// - Numări
// - Aduni
// - Verifici condiții
// - Modifici
copie = copie / 10; // Elimină ultima cifră
}
8. Cazuri Speciale
8.1 Numărul 0 are o cifră!
#include <iostream>
using namespace std;
int main() {
int numar = 0;
// ATENȚIE: while(numar > 0) nu se execută deloc pentru 0!
// Soluție: tratare specială
if(numar == 0) {
cout << "Numarul 0 are 1 cifra (cifra 0)" << endl;
}
return 0;
}
8.2 Numere negative
#include <iostream>
using namespace std;
int main() {
int numar = -1234;
// Pentru numere negative, lucrează cu valoarea absolută
if(numar < 0) {
numar = -numar; // Face pozitiv
}
// Acum poți lucra normal cu cifrele
cout << "Cifrele lui " << numar << ":\n";
while(numar > 0) {
cout << numar % 10 << " ";
numar /= 10;
}
return 0;
}
9. Exerciții de Înțelegere
Exercițiul 1: Ce face acest algoritm?
int numar = 12345;
int rezultat = 0;
while(numar > 0) {
rezultat += (numar % 10) * (numar % 10);
numar /= 10;
}
cout << rezultat;
Răspuns: Calculează suma pătratelor cifrelor: 1² + 2² + 3² + 4² + 5² = 55
Exercițiul 2: Completează algoritmul
int numar = 1234;
int produs = 1;
while(/* condiție */) {
produs *= /* ultima cifră */;
numar = /* elimină ultima cifră */;
}
cout << produs;
Soluție:
while(numar > 0) {
produs *= (numar % 10);
numar = numar / 10;
}
Exercițiul 3: Transformă acest număr
Input: 12345
Output: 135 (cifrele impare în ordinea originală)
Soluție:
int numar = 12345;
int rezultat = 0;
int putere = 1;
while(numar > 0) {
int cifra = numar % 10;
if(cifra % 2 != 0) { // Dacă e impară
rezultat = cifra * putere + rezultat;
putere *= 10;
}
numar /= 10;
}
În concluzie, să-ți spun ceva fundamental:
Operațiile cu cifre sunt baza pentru multe algoritmi mai complecși. Dacă înțelegi cum să “dezmembrezi” un număr în cifre, poți rezolva o gamă uriașă de probleme.
Regula de aur:
numar % 10→ ultima cifrănumar / 10→ numărul fără ultima cifră- Întotdeauna lucrează pe o copie a numărului original!
Așa că ai grijă când lucrezi cu cifre. Cunoștințe-ti operațiile de bază și construiește de acolo algoritmi mai complecși. Pentru că puterea de a manipula numerele cifră cu cifră este una dintre cele mai importante abilități în programare.