Hola25
Hola25 Logo
Hola25
Utilizatori disponibili

Înapoi la blog

Piese din lemn sunt extrase din capătul unui șir și așezate într-o tăviță, ca simbol al prelucrării cifrelor.
Ilustrație conceptuală generată cu AI; explicațiile și schemele de învățare sunt în articol.
Informatică

Cifrele unui număr la BAC: parcurgere și cazuri-limită

Hola25
Hola25
Autor

21 octombrie 2026

7 min citire

În acest articol

Pentru a parcurge cifrele unui număr natural în C++, folosești două operații: n%10 extrage ultima cifră, iar n/10 elimină ultima cifră prin împărțire întreagă. Repetând operațiile, citești numărul de la dreapta la stânga. La BAC, aceeași schemă se adaptează pentru sume, produse, numărări și verificarea unor proprietăți.

În această lecție ne concentrăm pe parcurgere și pe alegerea corectă a acumulatorilor. Nu construim oglinditul numărului și nu folosim recursivitate. Exemplele presupun numere naturale reprezentabile în tipul declarat. Dacă enunțul admite valori negative, semnul trebuie tratat separat; expresiile pentru cifre nu se aplică mecanic ca și cum semnul ar fi o cifră.

De ce funcționează împărțirea la zece

Orice număr natural se poate scrie ca n=10*q+r, unde restul r este între zero și nouă. Acest rest este cifra unităților, iar câtul q reprezintă cifrele rămase. Pentru n=5082, câtul este 508, iar restul este 2. La pasul următor lucrezi cu 508, nu cu valoarea inițială.

Schema este:

număr curent → extragi ultima cifră → o prelucrezi → elimini cifra → repeți.

Număr curent Ultima cifră Număr rămas
5082 2 508
508 8 50
50 0 5
5 5 0

Ordinea cifrelor extrase este doi, opt, zero, cinci. Ea este inversă față de ordinea în care citim numărul pe hârtie. Pentru sumă sau produs, această inversare nu schimbă rezultatul. Pentru verificarea unei ordini între cifre ori pentru construirea unui număr nou, sensul parcurgerii trebuie analizat atent.

Păstrează numărul inițial atunci când mai ai nevoie de el

Parcurgerea prin împărțiri modifică variabila. La final, ea ajunge la zero. Dacă trebuie să afișezi și numărul inițial sau să îl compari cu rezultatul unei prelucrări, fă o copie înainte de buclă. Nu încerca să refaci ulterior valoarea din suma cifrelor: multe numere diferite au aceeași sumă.

Un schelet de program pentru suma cifrelor este:

#include <iostream>
using namespace std;

int main() {
    unsigned long long n;
    cin >> n;
    unsigned long long copie = n;
    int suma = 0;
    do {
        int cifra = copie % 10;
        suma += cifra;
        copie /= 10;
    } while (copie > 0);
    cout << suma;
    return 0;
}

Am ales o buclă cu test final pentru ca și numărul zero să aibă o cifră prelucrată. În cazul sumei, o buclă cu test inițial și aceeași inițializare ar afișa tot zero, dar alte prelucrări nu ar mai coincide. Este mai sigur să decizi explicit cum tratezi zero decât să te bazezi pe o coincidență a rezultatului.

Cum alegi valoarea inițială

Ce calculezi Inițializare obișnuită Actualizare
Suma cifrelor suma=0 Aduni cifra
Numărul cifrelor numar=0 Adaugi unu
Produsul cifrelor produs=1 Înmulțești cu cifra
Cifra maximă maxim=0 Păstrezi cifra mai mare
Cifra minimă minim=9 Păstrezi cifra mai mică

Zero este element neutru pentru adunare, iar unu este element neutru pentru înmulțire. Dacă pornești produsul de la zero, orice rezultat va rămâne zero, indiferent de cifre. Pentru minim și maxim, limitele zero și nouă sunt potrivite deoarece acestea delimitează cifrele zecimale.

Aceste inițializări presupun că se prelucrează cel puțin o cifră. Dacă alegi o buclă care nu intră pentru zero, minimul ar putea rămâne nouă, iar produsul unu. Nu sunt rezultatele cifrei zero; sunt doar valorile inițiale rămase neatinse. Testul final sau tratarea separată a lui zero rezolvă problema.

Exemplu rezolvat: câte cifre pare și ce sumă au

Se dă n=70048. Cerința este să calculezi numărul cifrelor pare și suma lor. Folosești doi acumulatori, ambii inițializați cu zero. Pentru fiecare cifră, testezi cifra%2==0; numai în această ramură crești contorul și actualizezi suma.

Cifra extrasă Pară? Contor după pas Sumă după pas
8 Da 1 8
4 Da 2 12
0 Da 3 12
0 Da 4 12
7 Nu 4 12

Rezultatele sunt patru cifre pare și suma doisprezece. Zerourile cresc numărul cifrelor, dar nu schimbă suma. Dacă ai raportat doar două cifre pare, ai tratat în mod greșit zero ca nefiind par. Dacă ai numărat șapte drept par, probabil ai verificat paritatea numărului inițial în locul cifrei curente.

În interiorul buclei, condiția trebuie să descrie obiectul cerut. „Cifra este pară” și „numărul are o cifră pară” nu sunt aceeași condiție. Prima se testează local la fiecare pas; a doua se stabilește din rezultatele tuturor pașilor.

Verificarea unei proprietăți pentru toate cifrele

Pentru a decide dacă toate cifrele sunt impare, poți porni cu o variabilă logică adevărată. Când găsești o cifră pară, o setezi la fals. Nu o reseta la adevărat când întâlnești ulterior o cifră impară: existența unei singure abateri este suficientă pentru a respinge proprietatea.

De exemplu, pentru 5317, toate cifrele trec testul. Pentru 5307, cifra zero îl încalcă. Pentru zero însuși, rezultatul trebuie să fie fals: reprezentarea sa conține cifra pară zero. O buclă care nu prelucrează nicio cifră ar păstra accidental valoarea adevărată și ar produce un răspuns greșit.

Dacă vrei să verifici existența măcar a unei cifre impare, logica se schimbă: pornești cu fals și treci la adevărat la primul exemplu potrivit. Distinge întotdeauna „toate”, „există” și „exact una”. Aceste expresii conduc la strategii diferite: indicator de abatere, indicator de existență, respectiv contor.

Cifrele zero din interior și zerourile din față

Numărul 1002 are patru cifre, iar cele două zerouri din interior sunt prelucrate. În schimb, dacă citești 0012 într-o variabilă numerică prin intrare zecimală obișnuită, valoarea stocată este doisprezece; zerourile de la început nu mai fac parte din valoarea numărului.

Dacă problema cere să păstrezi un cod cu o lungime fixă și zerouri inițiale, datele trebuie tratate ca o reprezentare textuală sau însoțite de lungimea impusă. Nu confunda un număr natural cu un cod de identificare format din caractere. Într-o problemă de BAC, formularea intrării îți spune ce model să folosești.

Exerciții cu explicații

1. Pentru n=6205, determină suma, produsul și numărul cifrelor. Răspuns: suma este treisprezece, produsul este zero, iar numărul cifrelor este patru. Produsul se anulează deoarece una dintre cifre este zero, nu deoarece acumulatorul ar trebui inițializat cu zero.

2. Care este cifra minimă din 9004? Răspuns: zero. Dacă algoritmul omite cifrele egale cu zero, rezolvă o altă cerință: cea mai mică cifră nenulă. Cuvântul „nenulă” trebuie să apară explicit în enunț pentru a justifica filtrarea.

3. Câte cifre impare are 86420? Răspuns: niciuna. Contorul inițializat cu zero rămâne zero după toate cele cinci iterații. Acest caz verifică funcționarea unui contor atunci când filtrul nu acceptă niciun element.

4. Găsește un număr de trei cifre cu suma cifrelor egală cu zece și exact o cifră pară. Răspuns posibil: 136. Cifrele unu și trei sunt impare, iar șase este pară. Suma este zece. Verifică separat lungimea, suma și numărul cifrelor pare.

Întrebări frecvente

De ce împart după prelucrarea cifrei?

Pentru că împărțirea elimină cifra curentă. Dacă o faci înainte de extragere, sari peste cifra unităților din numărul inițial și schimbi rezultatul.

Cât de eficientă este parcurgerea?

Execută câte un pas pentru fiecare cifră și folosește un număr constant de variabile. Pentru un număr cu k cifre, timpul este proporțional cu k, iar memoria suplimentară este constantă.

Pot folosi aceeași buclă pentru mai multe rezultate?

Da. Suma, numărul cifrelor și cifra maximă pot fi actualizate la aceeași extragere. Fiecare rezultat are propriul acumulator și propria inițializare.

Pentru verificare, compară aceste metode cu cerințe din arhiva BAC. Notează de ce funcționează fiecare actualizare, folosind abordarea de învățare prin înțelegere. Un profesor de informatică îți poate verifica inclusiv cazurile de zero și de cifre repetate. Tema se regăsește în programa oficială de informatică, la algoritmi elementari; alege programa specializării tale.

Surse