
Cifrele unui număr. Prelucrarea cifrelor unui număr în C++
În această lecție vom învăța cum putem să manipulăm numere în limbaje precum C++, să extragem cifrele unui număr sau să formăm numere.
Când ne gândim la un număr, ne gândim la o înșiruire de cifre, având o
semnificație clară: numărul 123
este alcătuit din trei cifre, în această
ordine: 1, 2, 3
. Însă, pentru un calculator, un număr este o valoare de sine
stătătoare, cifrele sale neputând fi prelucrate individual.
Din fericire, însă, folosind diverse operații matematice putem să prelucrăm cifrele unui număr într-un mod ușor (și destul de intuitiv).
De regulă vom prelucra cifrele unui număr întreg — de tip int
sau long long
. Cu toate acestea, putem să extindem noțiunile și pentru alte tipuri,
precum float
sau double
(deși poate fi mai periculos).
Descompunerea cifrelor
Luăm un număr ca un exemplu: 123
. Să analizăm ce se întâmplă dacă împărțim
la 10
(cu cât și rest):
-
123 : 10 = 12 rest 3
Observăm două aspecte:
- Restul acestei împărțiri,
3
, este egal cu ultima cifră a numărului nostru inițial; - Câtul acestei împărțiri,
12
, este egal cu numărul nostru inițial, cu ultima cifră tăiată.
În cod, pentru a găsi ultima cifră a unui număr vom apela n % 10
, iar pentru
a tăia ultima cifră dintr-un număr vom apela n = n / 10
(în exemplul de mai
devreme, n = 123
).
int n = 123;
int u = n % 10;
cout << u << "\n"; //Se va afișa 3
n /= 10;
cout << n << "\n"; //Se va afișa 12
Să extindem un pic mai mult această idee: vrem să găsim ultimele două cifre
ale unui număr și numărul nostru fără aceste două cifre. În loc să aplicăm
operația de împărțire și de rest la 10
, vom împărți la 100
: n % 100
va
returna ultimele două cifre ale unui număr, iar n / 100
va returna numărul
fără ultimele două cifre. De exemplu, pentru n = 123
, ultimele două cifre
sunt n % 100 = 23
, iar numărul fără ultimele două cifre este n / 100 = 1
.
Intuitiv putem deduce o formulă generalizată: pentru a găsi ultimele k
cifre
ale lui n
, vom apela n % 10…0
(k
cifre de 0
), iar numărul fără
ultimele k
cifre ale lui n
este n / 10…0
(de asemenea, k
cifre de
0
).
int n = 34931;
int ultimeleTreiCifre = n % 1000; //Trei cifre de 0
cout << ultimeleTreiCifre << "\n"; //Se va afișa 931
n /= 1000; //Trei cifre de 0
cout << n << "\n"; //Se va afișa 34
Aflarea cifrei zecilor, cifrei sutelor, …
Să zicem că vrem să extragem cumva doar cifra zecilor a unui număr n
. Pentru
asta, tăiem ultima cifră a numărului folosind n = n / 10
, după care extragem
ultima cifră a acestui nou număr (care reprezenta cifra zecilor în numărul
inițial), folosind n = n % 10
.
int n = 123;
n = n / 10; //n este acum 12
n = n % 10; //n este acum 2, adică cifra zecilor lui 123
cout << n << "\n";
Aceasta este varianta recomandată, deoarece, dacă vrem să aflăm cifra sutelor
de exemplu, putem să îl împărțim pe n
la 100
în loc de 10
, tot restul
codului rămânând la fel ca cel precedent — codul fiind astfel mai ușor de
gestionat.
//Tot ce schimbăm este n / 10 -> n / 100
int n = 34931;
n = n / 100; //n este acum 349
n = n % 10; //n este acum 9, adică cifra sutelor lui 34931
cout << n << "\n";
Determinarea cifrelor unui număr
Până acum am învățat următoarele:
- Ultima cifră a lui
n
se poate obține aplicândn % 10
; - Pentru a tăia ultima cifră din
n
putem aplican = n / 10
.
Vom deduce următorul lucru:
- Dacă tăiem ultima cifră din
n
, când acesta are o singură cifră, atuncin
devine egal cu0
. Asta se întâmplă deoarece, pentru un număr de o cifră,n : 10 = 0 rest n
, așadar operațian / 10
este egală cu0
.
Folosind observația tocmai descoperită, ne dăm seama că putem să iterăm (parcurgem) cifrele unui număr astfel:
int n = 34931;
do {
int u = n % 10; //Determinăm ultima cifră curentă a lui n
cout << u << " "; //Prelucrăm ultima cifră a lui n: în acest caz, o afișăm
n /= 10; //Tăiem ultima cifră a lui n
} while(n != 0); //Cât timp n mai are cifre (este diferit de 0)
Programul va afișa 1 3 9 4 3
— mai exact, cifrele lui n
în ordine
inversă.
Iată o animație care parcurge exemplul pas cu pas:
Animație
Apasă pe butoanele de mai jos pentru a naviga prin animație.
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
int n = 34931; do { int u = n % 10; cout << u << " "; n /= 10; } while(n != 0);
n = 0 3 4 9 3 1
u = nicio valoare
Consolă:
Se încarcă…
Când folosim while
și când folosim do while
?
Observăm că în exemplul de mai sus am folosit structura repetitivă de tip do while
. Ca o reamintire:
Instrucțiunea
while
verifică condiția (în cazul nostrun != 0
), după care execută codul dintre acolade. Instrucțiuneado while
mai întâi execută codul dintre acolade, după care verifică condiția, executând încă odată codul dacă condiția mai este validă.
Să luăm cazul particular, când n = 0
. Răspunsul la care ne-am aștepta ar fi
0
, deoarece 0
are o singură cifră (0
). Cu toate acestea, dacă am fi
folosit while
în loc de do while
, ar fi verificat condiția mai întâi (n != 0
), ar fi văzut că este falsă (deoarece n
este egal cu 0
) și nu ar fi
executat codul dintre acolade, așadar nu ar fi afișat nimic. Folosind, în
schimb, do while
, codul ar fi executat (s-ar afișa 0
), după care s-ar
verifica dacă n
este diferit de 0
, după care s-ar opri.
Astfel, când folosim do while
, codul va merge și pentru n = 0
și de aceea
se recomandă folosirea structuriido while
când lucrăm cu cifre. Acest
caz particular este deseori nebăgat în seamă în lecții, însă este un aspect
important ce trebuie reținut.
Construirea unui număr folosind cifre
Am învățat să descompunem un număr în cifre individuale, însă acum ne propunem să formăm un număr folosind cifre.
Construirea unui număr de la sfârșit la început
Să zicem că avem un număr n = 123
și ne propunem să adăugăm cifra 4
la
coadă (formând numărul n = 1234
). Observăm că dacă îl înmulțim pe n
cu
10
și adunăm cifra 4
, obținem numărul dorit:
int n = 123;
n *= 10; //n devine 1230
n += 4; //n devine 1234
//Puteam scrie și n = n * 10 + 4;
cout << n << "\n";
Practic, am făcut loc unei cifre noi mutând toate cifrele la stânga cu o poziție și am adăugat cifra dorită printr-o adunare.
Putem să aplicăm repetat acest algoritm: să zicem că vrem să formăm numărul
1234
. Începem printr-un număr egal cu 0
, după care adăugăm repetat cifrele
la n
:
int n = 0;
n = n * 10 + 1; //n devine 0 * 10 + 1 = 1
n = n * 10 + 2; //n devine 1 * 10 + 2 = 12
n = n * 10 + 3; //n devine 12 * 10 + 3 = 123
n = n * 10 + 4; //n devine 123 * 10 + 4 = 1234
cout << n << "\n";
Ca o generalizare, să zicem că ni se dau n
cifre și trebuie să formăm
numărul cu cele n
cifre în ordinea dorită:
//Intrare: n = 5, cifrele: 3 4 9 3 1
//Ieșire: 34931
int n, nr = 0;
cin >> n;
for(int i = 1; i <= n; ++i) {
int cif;
cin >> cif;
nr = nr * 10 + cif;
}
cout << nr << "\n";
Construirea unui număr de la început la sfârșit
Să zicem că vrem să formăm un număr cu cifrele 1, 2, 3, 4
, dar de data
aceasta adăugând cifrele de la început spre sfârșit. Vom aborda astfel
problema:
int n = 0;
n = 1 * 1 + n; //n devine 1 * 1 + 0 = 1
n = 2 * 10 + n; //n devine 2 * 10 + 1 = 21
n = 3 * 100 + n; //n devine 3 * 100 + 21 = 321
n = 4 * 1000 + n; //n devine 4 * 1000 + 321 = 4321
cout << n << "\n";
Observăm că atunci când vrem să adăugăm o cifră nouă la n
, practic adăugăm
valoarea cifrei, înmulțită cu o putere de a lui 10
în funcție de numărul de
cifre ale lui n
.
Ca o generalizare, să zicem că ni se dau n
cifre și trebuie să formăm
numărul cu cele n
cifre, adăugând fiecare cifră la început. Vom crea o
valoare auxiliară p
, inițial egală cu 1
și la fiecare pas înmulțită cu
10
, reprezentând valoarea putere de 10
pe care am menționat-o mai devreme.
//Intrare: n = 5, cifrele: 1 3 9 4 3
//Ieșire: 34931
int n, nr = 0, p = 1;
cin >> n;
for(int i = 1; i <= n; ++i) {
int cif;
cin >> cif;
nr = cif * p + nr;
p *= 10;
}
cout << nr << "\n";
Probleme rezolvate
Iată câteva aplicații, împreună cu rezolvări.
Numărul de cifre
Dându-se un număr natural n
, să se determine numărul de cifre ale sale.
Testează-ți rezolvarea pe această pagină.
Exemple: Pentru n = 328
, rezultatul va fi 3
, iar pentru n = 0
,
rezultatul va fi 1
.
Rezolvare: Iterăm printre cifrele lui n
folosind o structură repetitivă
de tip do while
(vezi mai sus de ce nu una de tip while
), la fiecare pas
incrementând cu 1
o variabilă care reține numărul de cifre.
#include <iostream>
using namespace std;
int main()
{
int n, nrcif = 0;
cin >> n;
do {
nrcif++;
n /= 10;
} while(n != 0);
cout << nrcif;
return 0;
}
Suma cifrelor
Dându-se un număr natural n
, să se determine suma cifrelor sale. Testează-ți
rezolvarea pe această pagină.
Exemple: Pentru n = 328
, rezultatul va fi 3 + 2 + 8 = 13
, iar pentru
n = 0
, rezultatul va fi 0
.
Rezolvare: Iterăm printre cifrele lui n
folosind o structură repetitivă
de tip do while
(vezi mai sus de ce nu una de tip while
), la fiecare pas
incrementând cu cifra curentă o variabilă care reține numărul de cifre.
#include <iostream>
using namespace std;
int main()
{
int n, sumcif = 0;
cin >> n;
do {
int u = n % 10;
sumcif += u;
n /= 10;
} while(n != 0);
cout << sumcif;
return 0;
}
Oglinditul unui număr
Dându-se un număr natural n
, să se determine răsturnatul (sau oglinditul)
numărului. Testează-ți rezolvarea pe această pagină.
Exemple: Pentru n = 328
, rezultatul va fi 823
, iar pentru n = 0
,
rezultatul va fi 0
.
Rezolvare: Iterăm printre cifrele lui n
folosind o structură repetitivă
de tip do while
(vezi mai sus de ce nu una de tip while
). În timp ce luăm
și ștergem cifrele lui n
, construim în paralel un nou număr, care va reține
la final oglinditul.
#include <iostream>
using namespace std;
int main()
{
int n, oglindit = 0;
cin >> n;
do {
int u = n % 10;
oglindit = oglindit * 10 + u;
n /= 10;
} while(n != 0);
cout << oglindit << "\n";
return 0;
}
Bibliografie sau alte resurse
Dacă aveți nevoie vreodată doar de formulele din această lecție, puteți să vizionați copiuțele pentru cifrele unui număr.
Exerciții propuse
Se încarcă…
Avem pregătite 8 exerciții pentru tine, pentru a-ți testa cunoștințele și a-ți îmbunătăți abilitățile.
Exercițiul 1
Răspuns corect!
Cu ce trebuie înlocuite punctele de suspensie astfel încât se adauge la coada lui n
cifra 4
?
int n = 123;
...
cout << n << "\n"; // 1234
Exercițiul 2
Răspuns corect!
Grupează în perechi noțiunile echivalente.
Exercițiul 3
Răspuns corect!
Completează următoarea secvență de cod astfel încât să se afișeze a treia cifră a lui n
:
int n = 32419;
cout << (n / ...) % 10 << "\n"; //4
Exercițiul 4
Răspuns corect!
Ne dorim să calculăm produsul cifrelor numărului n
. Cum trebuie să fie inițializată variabila p
?
int n, p = ...;
cin >> n;
do {
int u = n % 10;
p *= u;
n /= 10;
} while(n != 0);
cout << p << "\n";
Exercițiul 5
Răspuns corect!
Care este valoarea variabilei sum
după executarea secvenței de cod?
int n = 12345, sum = 0;
do {
sum += (n % 10) * (n % 2);
n /= 10;
} while (n != 0);
cout << sum << "\n";
Exercițiul 6
Răspuns corect!
Grupează în perechi expresiile și semnificațiile lor corecte.
Exercițiul 7
Răspuns corect!
Adevărat sau Fals: n % 10
este echivalent cu n - (n / 10) * 10
.
Exercițiul 8
Răspuns corect!
Contează dacă folosim while
sau do ... while
în algoritmii cu cifre?
DS
Autorul acestei lecții
Dominic Satnoianu
Această lecție a fost redactată de către Dominic Satnoianu.
© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.
Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.
Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.
Comentarii 0