Algoritmi elementari pe numere

Cifrele unui număr

Cum iei cifrele unui număr una câte una și cum construiești alt număr din ele, în aceeași ordine sau invers. Tema apare la Subiectul I, la II.1 și mai ales la III.1, rezolvată pe lucrări oficiale, cu punctele din barem.

  • 26 min
  • La BAC: I · Subiectul al II-lea, 1 (28p) · Subiectul al III-lea, 1 (10p)
  • De revizuit
Ilustrație: Cifrele unui număr
Ilustrație generată pentru ZECE (artistică, nu o planșă științifică: pentru detalii exacte vezi schemele din lecție).

ții minte doar fișa asta și ești acoperit

Fișa de aur

  1. 01

    Cele două operații: n%10 îți dă ultima cifră, n=n/10 o elimină. Repeți până când n devine 0.

    Truc: Mod ia, div taie.

  2. 02

    Ordine inversă: r=r·10+c; pornești cu r=0.

  3. 03

    Aceeași ordine: r=c·p+r; p=p·10; pornești cu r=0 și p=1.

  4. 04

    III.1 = 10 p: antet 2, valoare determinată 6, return 1, variabile locale și corectitudine 1 (iunie 2026).

  5. 05

    Zerouri la final: oglinditul le pierde. Baremul le punctează separat, deci folosește adăugarea la stânga.

  6. 06

    Numărul 0: while(n!=0) nu intră deloc în buclă. Dacă 0 e în domeniu, verifică ce se întâmplă sau folosește do...while.

1 din 10

Pe scurt

1 minesențialul, de recitit oricând

Culorile din lecție:cifră, datăidee-cheie

  • Ultima cifră este n%10, iar n=n/10 o elimină. Cu aceste două operații rezolvi aproape orice problemă pe cifre.
  • Parcurgerea merge de la dreapta la stânga. Din cifre poți construi alt număr, în ordine inversă sau în aceeași ordine.
  • Tema apare la ambele specializări. La III.1 aceeași problemă se cere ca subprogram la matematică-informatică și în pseudocod la științele naturii.

Ideea, apoi numele oficial

3 min 2 întrebări la final

Ia numărul 472. Împarte-l la 10: câtul e 47, restul e 2. Restul e ultima cifră, iar câtul e numărul fără ea. Mai faci o dată: 7 și 4. Mai faci o dată: 4 și 0. Când câtul a ajuns 0, ai trecut prin toate cifrele.

while(n!=0)
{ c=n%10;
  // aici folosești cifra c
  n=n/10;
}

Oficial, baremul numește asta algoritm de bază de parcurgere a cifrelor unui număr și îi dă de obicei un punct separat. Formularea apare la iunie 2026, III.1, și la august 2026, III.1.

Ultima cifră
C/C++
n%10
Pseudocod
n%10
Pascal
n mod 10
Fără ultima cifră
C/C++
n/10 (numere întregi)
Pseudocod
[n/10]
Pascal
n div 10
1 / 2

Cu aceeași buclă faci sarcinile de bază:

Numărul de cifre
Inițial
nr=0
La fiecare cifră
nr++
Suma cifrelor
Inițial
s=0
La fiecare cifră
s=s+c
Câte cifre pare
Inițial
nr=0
La fiecare cifră
if(c%2==0) nr++
Toate cifrele respectă o condiție
Inițial
ok=1
La fiecare cifră
if(condiția e falsă) ok=0
1 / 4

Ce rămâne în r după r=0; apoi r=r·10+c, pentru cifrele 3, 2, 1?

Câte cifre are numărul când ieși din while(n!=0), dacă ai un contor?

Două feluri de a construi un număr

2 min

Cifrele vin de la dreapta la stânga. Contează unde le lipești.

Ordine inversă (oglinditul)
Formula
r=r*10+c
Pentru 120 obții
21
Aceeași ordine
Formula
r=c*p+r; p=p*10;
Pentru 120 obții
120
1 / 2

În a doua formulă, p ține minte poziția la care ajunge următoarea cifră: unități, zeci, sute.

Oficial: simulare 2026, II.1 (MI și SN)

3 min

Algoritmul de mai jos folosește ambele formule în aceeași buclă. La a) se cere valoarea afișată pentru 250326 (6 p, răspuns corect 2026).

citește n (număr natural)
x←0; y←0; p←1
┌repetă
│ c←n%10; n←[n/10]
│┌dacă c%2=0 atunci
││ x←x*10+c
││ y←c*p+y; p←p*10
│└■
└până când n=0
┌dacă x<y atunci scrie x
│altfel scrie y
└■
6
x
6
y
6
p
10
2
x
62
y
26
p
100
3
x
62
y
26
p
100
0
x
620
y
26
p
1000
5
x
620
y
26
p
1000
2
x
6202
y
2026
p
10000
1 / 6

Se afișează minimul dintre 6202 și 2026, adică 2026. Observă rândul cu cifra 0: x crește de 10 ori, iar y rămâne la fel. Așa ajung la valori diferite.

La b) se cer două numere din [1000,9999] pentru care se afișează 64 (3 p pentru fiecare). Gândește invers: 64 trebuie să fie valoarea cu cifrele pare în ordine, deci numărul are cifrele 6 și 4 în această ordine, plus un 0, iar x trebuie să fie mai mare. De exemplu 1064 dă x=460, y=64. Baremul acceptă formele x064, x460, 4x60, 4600, 460x, 46x0, cu x cifră impară.

Oficial: iunie 2026, varianta 3, III.1

5 min o întrebare la final

Numărul n are toate cifrele nenule și cel puțin o cifră pară și una impară. Se cere numărul format din cifrele impare, în ordine, urmate de cifrele pare, în ordine. Pentru n=19472, rezultatul e 19742.

La matematică-informatică se cere subprogramul ImparPar, cu parametrul n, care returnează rezultatul.

int ImparPar(int n)
{ int ni=0,np=0,pi=1,pp=1,c;
  while(n!=0)
  { c=n%10;
    if(c%2==1)
    { ni=c*pi+ni;
      pi=pi*10;
    }
    else
    { np=c*pp+np;
      pp=pp*10;
    }
    n=n/10;
  }
  return ni*pp+np;
}

La final, pp e 10 la puterea numărului de cifre pare. Prin ni*pp faci loc cifrelor pare, apoi le adaugi. Pentru 19472: ni=197, np=42, pp=100, deci 197*100+42=19742. Cum n are cel mult 9 cifre, rezultatul încape în int.

La științele naturii se cere aceeași problemă, în pseudocod.

citește n
ni←0; np←0; pi←1; pp←1
┌cât timp n≠0 execută
│ c←n%10
│┌dacă c%2=1 atunci
││ ni←c*pi+ni; pi←pi*10
││altfel
││ np←c*pp+np; pp←pp*10
│└■
│ n←[n/10]
└■
scrie ni*pp+np

Barem MI (10 p)Puncte

antet: structură, parametru de intrare
2
valoare determinată, câte 1 p: parcurgerea cifrelor, obținerea unui număr din cifre, cifrele impare, cifrele pare, ordinea în fiecare grup, ordinea grupurilor
6
instrucțiunea de returnare
1
variabile locale, corectitudine globală
1

Barem SN (10 p)Puncte

date citite
1
valoare determinată, aceleași 6 aspecte
6
date scrise
1
structuri de control scrise principial corect, corectitudine globală
2

Cum afli dacă toate cifrele lui n sunt mai mici decât b?

Oficial: august 2026, varianta 1, III.1

2 min

Un număr este reprezentat în baza b dacă toate cifrele lui sunt din [0,b-1]. Pentru n=32412 răspunsul e 1 la b=8 și -1 la b=3.

Ce verifici, de fapt? Că nu există o cifră prea mare. La prima cifră >=b te poți opri.

int baza(int n,int b)
{ while(n!=0)
  { if(n%10>=b)
      return -1;
    n=n/10;
  }
  return 1;
}

Pentru n=0 bucla nu rulează și funcția returnează 1, ceea ce e corect: cifra 0 aparține intervalului pentru orice bază.

Barem MI: antet 2 p; proprietate verificată 6 p, câte 2 p pentru parcurgerea cifrelor, identificarea unei cifre corespunzătoare sau nu bazei, algoritmul de verificare a unei proprietăți; returnare 1 p; variabile locale și corectitudine globală 1 p. La științele naturii se cere aceeași verificare în pseudocod.

Oficial: simulare 2024, MI, III.1

2 min

Subprogramul Impare primește n din [1,10⁴] și returnează numărul obținut prin duplicarea fiecărei cifre impare sau -1 dacă nu există cifre impare. Pentru n=3361 se obține 3333611.

int Impare(int n)
{ int r=0,p=1,c,gasit=0;
  while(n!=0)
  { c=n%10;
    r=c*p+r;
    p=p*10;
    if(c%2==1)
    { r=c*p+r;
      p=p*10;
      gasit=1;
    }
    n=n/10;
  }
  if(gasit==0) return -1;
  return r;
}

Valoarea cea mai mare e pentru 9999, adică 99999999, care încape în int.

Barem: antet 2 p; număr determinat 6 p, câte 1 p pentru accesul la o cifră, cifrele analizate, identificarea unei cifre pare sau impare, adăugarea unei cifre la un număr, cifrele păstrate, inclusiv cele nule de la final, ordinea cifrelor; returnare și tratarea cazului -1, 1 p; variabile locale și corectitudine globală 1 p.

Oficial: la Subiectul I, model 2027, SN, I.4

1 min

Se cere ce poate înlocui punctele de suspensie, astfel încât p să rețină prima cifră pară a lui n, sau -1 dacă nu există.

p=-1;
do
{ .....
  if(c%2==0) p=c;
}while(n!=0);

Răspunsul corect e B: c=n%10; n=n/10; (4 p). Prima cifră din stânga e ultima pe care o vezi. De aceea atribuirea p=c nu are nevoie de altă condiție: fiecare cifră pară o suprascrie pe cea de dinainte, iar la final rămâne cea mai din stânga.

Ce se cere la BAC

4 mincum apare la examen

Rezervă 2026 var. 5, MI
Item
II.1
Cerința pe cifre
de câte ori apare cifra k în numerele din [m,n]; pentru 120, 126, 2 răspunsul e 8
Model 2026, MI
Item
III.1
Cerința pe cifre
fiecare secvență 25 din n devine 26
Sesiunea specială 2026, MI
Item
III.1
Cerința pe cifre
poziția primei cifre pare, numărată din stânga
Iunie 2025 var. 1, MI și SN
Item
III.1
Cerința pe cifre
suma numerelor cu toate cifrele cel puțin egale cu o cifră dată
Simulare 2025, MI
Item
III.1
Cerința pe cifre
cel mai mare număr cel mult k, divizibil cu suma cifrelor lui
Sesiunea specială 2024, MI
Item
III.1
Cerința pe cifre
nouă cifre din mulțimea {1,2,3,4}, cu fiecare cifră prezentă
Model 2023, MI și SN
Item
III.1
Cerința pe cifre
toate cifrele din mulțimea {2,3}
1 / 7

Greșeli care costă puncte

1 mincapcanele de evitat

  • Cifra 0 la final, pierdută prin oglindire, când trebuia păstrată.
  • p neactualizat sau pornit de la 0: toate cifrele se adună prost.
  • Numărul folosit după buclă, când el deja e 0. Copiază-l înainte.
  • n=0 uitat, când 0 e în domeniu: while(n!=0) nu intră deloc în buclă.
  • c%2==1 scris pentru o cifră nulă. 0 e cifră pară, deci intră pe ramura pară.
  • / la numere reale. n/10 taie cifra doar dacă n e întreg. În Pascal scrii div, nu /.

Termeni-cheie

Ultima cifră
Restul împărțirii la 10: n%10. În Pascal: n mod 10.
Eliminarea ultimei cifre
Câtul împărțirii la 10: n=n/10, pentru variabile întregi. În pseudocod se scrie [n/10]; în Pascal, n div 10.
Parcurgerea cifrelor
Structura repetitivă care ia cifrele de la dreapta la stânga până când numărul devine 0. Baremul o numește algoritm de bază de parcurgere a cifrelor unui număr.
Adăugare la dreapta
r=r·10+c. Cifrele apar în ordine inversă față de parcurgere, adică se obține oglinditul.
Adăugare la stânga
r=c·p+r, apoi p=p·10. Cifrele își păstrează ordinea din numărul inițial, inclusiv zerourile de la final.
Oglindit
Numărul scris cu cifrele în ordine inversă. Oglinditul lui 120 este 21: zeroul din față nu se mai vede.

Notițele mele

Salvat local

Surse