Programare Competitivă

Descompunerea unui număr în cifre

În programare, lucrăm foarte des cu numere.
Uneori însă, nu este suficient să știm valoarea unui număr ca întreg, ci avem nevoie să lucrăm separat cu cifrele lui.

De exemplu:

  • să aflăm ultima cifră a unui număr;
  • să calculăm suma cifrelor;
  • să verificăm dacă un număr este palindrom;
  • să numărăm câte cifre are un număr.

Pentru toate aceste situații, avem nevoie de descompunerea unui număr în cifre.


Ce înseamnă descompunerea în cifre?

Un număr este format din cifre.

De exemplu:

  • numărul 345 este format din cifrele 3, 4 și 5;
  • numărul 1024 este format din cifrele 1, 0, 2 și 4.

Descompunerea în cifre înseamnă să separăm aceste cifre una câte una, folosind operații matematice simple.


Operații esențiale

Pentru a descompune un număr în cifre, folosim două operații foarte importante:

Împărțirea întreagă / 10

Aceasta ne ajută să „tăiem” ultima cifră a unui număr.

Exemplu:

123 / 10 = 12

Restul împărțirii % 10

Aceasta ne spune ultima cifră a numărului.

Exemplu:

123 % 10 = 3

Ideea de bază

Pentru un număr n:

  • n % 10 → ultima cifră;
  • n / 10 → numărul fără ultima cifră.

Folosind aceste două operații în mod repetat, putem obține toate cifrele unui număr.


Un prim exemplu simplu

int n = 347;

cout << n % 10 << endl; // 7
n = n / 10; // 347 -> 34

cout << n % 10 << endl; // 4
n = n / 10; // 34 -> 3

cout << n % 10 << endl; // 3

Observăm că cifrele apar de la dreapta la stânga.


Descompunerea unui număr folosind while

int n = 528;

while (n > 0) {
    int cifra = n % 10;
    cout << cifra << endl;
    n = n / 10;
}

Ce face acest program:

  1. extrage ultima cifră;
  2. o afișează;
  3. elimină cifra din număr;
  4. repetă pașii până când numărul devine 0.

Suma cifrelor unui număr

int n = 345;
int suma = 0;

while (n > 0) {
    suma = suma + n % 10;
    n = n / 10;
}

cout << suma;
Output:
12

Numărul de cifre ale unui număr

int n = 9021;
int cnt = 0;

while (n > 0) {
    cnt++;
    n = n / 10;
}

cout << cnt;
Output:
4

Cum aflăm primele k cifre ale unui număr

Pentru a afla primele k cifre ale unui număr n, vom elimina, pe rând, cifrele de la final, până când numărul rămâne cu exact k cifre.

De exemplu, pentru a afla primele 3 cifre ale numărului n = 27623, putem folosi următorul algoritm:

int n = 27623;

while (n > 999) {
    n = n / 10;
}

cout << n;
Output:
276

Ce face programul?

1. Stabilim limita

Pentru k = 3, cel mai mare număr cu 3 cifre este 999. Atât timp cât n este mai mare decât 999, înseamnă că are mai mult de 3 cifre.

2. Verificăm numărul de cifre

Programul verifică dacă n > 999.

3. Eliminăm ultima cifră

Dacă condiția este adevărată, împărțim numărul la 10. Astfel, n „pierde” ultima cifră.

4. Repetăm pașii

Verificarea se face din nou, până când n rămâne cu exact k cifre.

5. Afișăm rezultatul

La final, n conține primele k cifre ale numărului inițial.

De reținut

Pentru k cifre, limita este cel mai mare număr cu k cifre (9, 99, 999, 9999 etc.).

Operația / 10 elimină ultima cifră a unui număr.

Algoritmul funcționează pentru orice valoare a lui k.

Hint: pentru a afla limita lui n putem calcula 10k - 1


Greșeli frecvente

1. Uitarea modificării lui n

while (n > 0) {
    cout << n % 10;
    // lipseste n = n / 10;
}

Aceasta duce la buclă infinită.


2. Cazul n = 0

Numărul 0 are o singură cifră, dar bucla while (n > 0) nu se execută. Acest caz trebuie tratat separat, dacă este necesar.

O altă variantă mai ușoară de a aborda acest caz, este de a folosi instrucțiunea do-while

Cod exemplu do-while

int n = 0;
int cnt = 0;

do {
    cnt++;
    n = n / 10;
}while (n > 0);

cout << cnt;
Output:
1

Când folosim descompunerea în cifre?

  • la probleme cu sume de cifre;
  • la verificări speciale;
  • la exerciții de logică numerică;
  • la probleme de concurs.

Ce să reții

  • Un număr este format din cifre.
  • % 10 ne dă ultima cifră.
  • / 10 elimină ultima cifră.
  • Cifrele apar de la dreapta la stânga.
  • Trebuie tratat cu atenție cazul n = 0.
  • Atenție la buclele infinite.

Probleme

pbinfoSuma Cifrelor

pbinfoSuma Prefixe

pbinfoProduscifreimpare

pbinfoInventie

pbinfoPalindrom1