Informatică BAC: parcurs cu 50 de lecții
Pregătește informatica pentru BAC în 50 de lecții: algoritmi, tablouri, texte, subprograme și grafuri. Exersează prin exemple, grile și fișe de verificare.
Înapoi la blog

21 octombrie 2026
7 min citire
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ă.
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.
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.
| 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.
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.
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.
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.
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.
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.
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ă.
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.
Official curriculum reference
Official curriculum reference (www.edu.ro)Folosim cookie-uri pentru a îmbunătăți experiența ta pe Hola25. Cookie-urile esențiale sunt necesare pentru funcționarea platformei. Poți personaliza setările pentru cookie-uri de analiză și marketing.
Politica de cookies | Politica de confidențialitatePregătește informatica pentru BAC în 50 de lecții: algoritmi, tablouri, texte, subprograme și grafuri. Exersează prin exemple, grile și fișe de verificare.

Înțelege complexitatea buclelor la BAC. Compară parcurgeri succesive, imbricate și împărțiri repetate, apoi justifică timpul și memoria algoritmului.