n%10n%10n mod 10Cum 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.

ții minte doar fișa asta și ești acoperit
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.
Ordine inversă: r=r·10+c; pornești cu r=0.
Aceeași ordine: r=c·p+r; p=p·10; pornești cu r=0 și p=1.
III.1 = 10 p: antet 2, valoare determinată 6, return 1, variabile locale și corectitudine 1 (iunie 2026).
Zerouri la final: oglinditul le pierde. Baremul le punctează separat, deci folosește adăugarea la stânga.
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.
Culorile din lecție:cifră, datăidee-cheie
n%10, iar n=n/10 o elimină. Cu aceste două operații rezolvi aproape orice problemă pe cifre.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.
n%10n%10n mod 10n/10 (numere întregi)[n/10]n div 10| Operație | C/C++ | Pseudocod | Pascal |
|---|---|---|---|
| Ultima cifră | n%10 | n%10 | n mod 10 |
| Fără ultima cifră | n/10 (numere întregi) | [n/10] | n div 10 |
Cu aceeași buclă faci sarcinile de bază:
nr=0nr++s=0s=s+cnr=0if(c%2==0) nr++ok=1if(condiția e falsă) ok=0| Sarcină | Inițial | La fiecare cifră |
|---|---|---|
| Numărul de cifre | nr=0 | nr++ |
| Suma cifrelor | s=0 | s=s+c |
| Câte cifre pare | nr=0 | if(c%2==0) nr++ |
| Toate cifrele respectă o condiție | ok=1 | if(condiția e falsă) ok=0 |
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?
Cifrele vin de la dreapta la stânga. Contează unde le lipești.
r=r*10+cr=c*p+r; p=p*10;| Vrei | Formula | Pentru 120 obții |
|---|---|---|
| Ordine inversă (oglinditul) | r=r*10+c | 21 |
| Aceeași ordine | r=c*p+r; p=p*10; | 120 |
În a doua formulă, p ține minte poziția la care ajunge următoarea cifră: unități, zeci, sute.
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
└■
| c | x | y | p |
|---|---|---|---|
| 6 | 6 | 6 | 10 |
| 2 | 62 | 26 | 100 |
| 3 | 62 | 26 | 100 |
| 0 | 620 | 26 | 1000 |
| 5 | 620 | 26 | 1000 |
| 2 | 6202 | 2026 | 10000 |
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ă.
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
| 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
| 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?
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.
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.
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.
k în numerele din [m,n]; pentru 120, 126, 2 răspunsul e 8n devine 26k, divizibil cu suma cifrelor lui{1,2,3,4}, cu fiecare cifră prezentă{2,3}| Lucrare | Item | Cerința pe cifre |
|---|---|---|
| Rezervă 2026 var. 5, MI | II.1 | de câte ori apare cifra k în numerele din [m,n]; pentru 120, 126, 2 răspunsul e 8 |
| Model 2026, MI | III.1 | fiecare secvență 25 din n devine 26 |
| Sesiunea specială 2026, MI | III.1 | poziția primei cifre pare, numărată din stânga |
| Iunie 2025 var. 1, MI și SN | III.1 | suma numerelor cu toate cifrele cel puțin egale cu o cifră dată |
| Simulare 2025, MI | III.1 | cel mai mare număr cel mult k, divizibil cu suma cifrelor lui |
| Sesiunea specială 2024, MI | III.1 | nouă cifre din mulțimea {1,2,3,4}, cu fiecare cifră prezentă |
| Model 2023, MI și SN | III.1 | toate cifrele din mulțimea {2,3} |
p neactualizat sau pornit de la 0: toate cifrele se adună prost.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 /.