Prelucrarea cifrelor unui numar pentru incepatori in C++
Acest articol urmăreşte aplicarea diferitelor aplicații cu cifrele unui număr: suma cifrelor, numărul de cifre, oglinditul unui număr ş.a.m.d. Puteți găsi multe probleme care cer prelucrarea cifrelor unui număr la concursuri sau chiar olimpiade.
Cuprinsul lecției
Descompunerea în cifre
Noi percepem numerele ca fiind o înşiruire de cifre, prima fiind cea mai din stânga, iar ultima fiind cea mai din dreapta. Însă, trebuie să fim mai expliciți cu sistemul de calcul. Ca să exprimăm diferite cifre, ne folosim de diferite operații aritmetice^2. Haideți să analizăm, spre exemplu, ultima cifră a unui număr. Pentru simplitate vom folosi int
.
Observăm că ultima cifră a unui număr se poate obține prin operația n % 10
. Mai mult, dacă vrem să tăiem ultima cifră, putem cu uşurință să aplicăm n / 10
(deoarece numărul rămâne mereu întreg, iar ultima cifră se elimină). Exemple:
325 % 10 = 5 ; 325 / 10 = 32
104 % 10 = 4; 104 / 10 = 10
5 % 10 = 5 ; 5 / 10 = 0
Perfect! Acum se pune întrebarea, cum luăm cifra de ordinul zecilor, sutelor, ... ? Nu este chiar aşa de greu: ştim deja că cifra unităților este n % 10
. Pentru cifra zecilor, tăiem cifra unităților (n = n / 10
) şi aplicăm afişăm n % 10
. Pentru cifra sutelor, n = n / 100
şi afişăm n % 10
. Putem aplica şi o structură repetitivă pentru o generalizare: împărțim repetat la 10 până când ajungem la cifra care ne interesează:
int n = 12345; //numărul nostru
int x; //vom afla a 4-a cifră de la coadă — adică a doua
//din față
while(x) {
x--;
n = n / 10;
}
cout<<n % 10; //se va afişa 2
Am învățat cum să luăm o anumită cifră dintr-un număr. Dar cum facem dacă vrem să le luăm pe toate?
Fireşte că vom folosi o structură repetitivă. Dar care este condiția de oprire? Haideți să luăm următorul exemplu:
1234 / 10 → 123
123 / 10 → 12
12 / 10 → 1
1 / 10 → 0
Ne-am oprit când numărul a ajuns la 0
, adică, cât timp mai aveam noi cifre de luat. Aşadar, în cod, dacă am vrea să afişăm fiecare cifră în parte, am aplica:
int n = 12345;
while(n != 0) { //sau, mai simplu, while(n)
int cifra = n % 10;
cout<<cifra<<" ";
n = n / 10;
}
Apare însă o problemă. Ce ne facem dacă numărul este chiar 0
? Nu ar intra în structura repetitivă. Soluția ar fi ori să facem un caz particular pentru 0
, ori să folosim un do while
ca să ne asigurăm că intră cel puțin odată:
//codul corect.
int n = 12345;
do {
int cifra = n % 10;
cout<<cifra<<" ";
n = n / 10;
} while(n);
Recomandăm, aşadar, folosirea do while
când se lucrează cu cifre!
Prelucrarea cifrelor numerelor reale
Este de remarcat faptul că nu putem utiliza %
(modulo) cu numerele reale. Astfel, dacă vrem să aflăm ultima cifră a părții întregi a unui număr real, trebuie să convertim numărul în număr întreg (care implicit taie partea zecimală) şi dupaia să efectuăm operația aritmetică. Aşadar, obținem:
double x = 203.75; cout<<((int)x) % 10;
Dacă vrem să efectuăm operații cu cifrele din partea zecimală, spre exemplu să găsim a 2-a cifră zecimală:
double x = 23.7534; cout<<((long long)(x * 100)) % 10; //atenție, numărul poate ieşi din int!
Aplicații cu cifrele unui număr
Toate aplicațiile au aceeaşi structură:
cât timp (avem cifre) {
luăm ultima cifră; //int cif = n % 10;
o prelucrăm;
o tăiem din număr; //n = n / 10;
}
Suma cifrelor
Pentru suma cifrelor, avem o variabilă sum
pe care o actualizăm cu fiecare cifră citită.
int n = 12345, sum = 0;
while(n) { //Observăm că nu este nevoie de do while
la suma cifrelor
//pt că pentru 0
, sum
va fi tot 0
.
int cif = n % 10; //nu este necesar să salvăm într-o variabilă
sum = sum + cif;
n = n / 10;
}
cout<<sum;
Numărul de cifre
În loc să adunăm cif
, adunăm 1
.
int n = 12345, nr = 0;
do {
//nu ne interesează cifra.
nr++;
n = n / 10;
} while(n);
cout<<nr;
Oglinditul numărului
La oglindit, formăm un alt număr, punând cifrele în ordine inversă:
int n = 12345, oglindit = 0;
while(n) {
int cif = n % 10; //nu este necesar să salvăm într-o variabilă
oglindit = oglindit * 10 + cif;
n = n / 10;
}
cout<<oglindit;
Test din cifrele unui număr
Completează următoarea secvență de cod:
cin>>n;
//n
are mai mult de 3 cifre.
//salvăm în n
cifra sutelor a lui n
n = n / % 10;
· Vezi răspunsulCompletează următoarea secvență de cod:
//calculează suma cifrelor lui n
int s = 0;
while(n) {
s += % 10;
n /= 10;
}
· Vezi răspunsulCompletează următoarea secvență de cod:
//calculează produsul cifrelor lui n
int p = ;
do {
p *= n % 10;
n /= 10;
} while(n);
· Vezi răspunsulAlte resurse şi bibliografie
- Tutoriale-Pe.net
- pbinfo (prezintă şi nişte aplicații mai interesante :) )