Prelucrarea cifrelor

Bază~14 min11 pași

De ce contează?

Ai o pușculiță plină și o golești scoțând câte o monedă pe rând, de jos. La fel „desfaci" un număr: îi iei ultima cifră, o pui deoparte, apoi tai numărul și repeți. Cu două operații — restul și împărțirea — ajungi la oricare cifră.

Cele două unelte: % 10 și / 10

Orice prelucrare pe cifre se sprijină pe două operații:

  • n % 10 — ultima cifră (restul împărțirii la 10).
  • n / 10 — numărul fără ultima cifră (împărțire întreagă).
cifre
2
0
2
4
n%10
Pentru n = 2024, n%10 dă cifra evidențiată (4). Apoi n/10 = 202 și reflectorul se mută pe noua ultimă cifră.

Algoritm pas cu pas: extragerea cifrelor

Pentru n = 2024, repetăm „ia ultima cifră, taie-o":

Pasnn % 10 (cifra)n / 10 (rămâne)
120244202
2202220
32002
4220 → stop

Cifrele ies în ordine inversă: 4, 2, 0, 2.

Implementare: suma și numărul cifrelor

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int copie = n;          // lucram pe copie, pastram n intact
    int suma = 0, cate = 0;
    while (copie > 0) {
        int cifra = copie % 10;   // ultima cifra
        suma += cifra;
        cate++;
        copie /= 10;              // taiem ultima cifra
    }
    cout << "Suma cifrelor: " << suma << "\n";   // 2024 -> 8
    cout << "Numar de cifre: " << cate << "\n";  // 2024 -> 4
    return 0;
}

Pentru n = 2024: suma 2+0+2+4 = 8, are 4 cifre.

Observația-cheie

Bucla golește numărul pe care lucrează (ajunge 0). De aceea folosim copie, nu n direct — altfel pierdem valoarea originală pentru calcule ulterioare.

Cifra maximă

Aceeași schemă, dar reținem cea mai mare cifră văzută:

int copie = n, maxCifra = 0;
while (copie > 0) {
    int cifra = copie % 10;
    if (cifra > maxCifra) maxCifra = cifra;
    copie /= 10;
}
// pentru 2024 -> maxCifra = 4
Observația-cheie

Inițializăm maxCifra = 0 fără grijă: orice cifră e între 0 și 9, deci 0 e o limită inferioară sigură. (La maximul unor numere oarecare, în schimb, ai inițializa cu primul element, nu cu 0.)

Complexitate

CazTimpSpațiu
oricareO(log₁₀ n) ≈ nr. de cifreO(1)

Faci un pas per cifră. Un număr de un miliard are doar 10 cifre → extrem de rapid.

Greșeli frecvente

Capcane reale la prelucrarea cifrelor:

  • Distrugi n: rulezi bucla pe n în loc de pe copie și apoi îl mai folosești — dar a devenit 0.
  • Cazul n = 0: while (n > 0) nu intră deloc, deci „numărul de cifre" iese 0. Dacă problema cere ca 0 să aibă o cifră, tratează-l separat.
  • Numere negative: -2024 % 10-4 în C++. Lucrează pe abs(n) dacă pot apărea negative.
  • Ordinea cifrelor: ies de la unități spre stânga (invers). Dacă ai nevoie de ordinea normală, construiește rezultatul invers sau reține cifrele într-un vector.

De reținut

  • n % 10 = ultima cifră; n / 10 taie ultima cifră.
  • while (copie > 0) parcurge toate cifrele, fără să știi câte sunt.
  • Lucrează pe o copie ca să nu distrugi numărul; tratează separat n = 0 și negativele.

Întrebarea 1 / 3

Ce îți dă `n % 10` pentru n = 2024?