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 |
Algoritm pas cu pas: extragerea cifrelor
Pentru n = 2024, repetăm „ia ultima cifră, taie-o":
| Pas | n | n % 10 (cifra) | n / 10 (rămâne) |
|---|---|---|---|
| 1 | 2024 | 4 | 202 |
| 2 | 202 | 2 | 20 |
| 3 | 20 | 0 | 2 |
| 4 | 2 | 2 | 0 → 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.
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 = 4Iniț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
| Caz | Timp | Spațiu |
|---|---|---|
| oricare | O(log₁₀ n) ≈ nr. de cifre | O(1) |
Faci un pas per cifră. Un număr de un miliard are doar 10 cifre → extrem de rapid.
Capcane reale la prelucrarea cifrelor:
- Distrugi
n: rulezi bucla penîn loc de pecopieș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 % 10dă-4în C++. Lucrează peabs(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 / 10taie 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.