100din100

Prelucrarea cifrelor unui numar pentru incepatori in C++

Publicat la 16 martie 2020 · incepatori clasa 9 cpp


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//pentru mai multe detalii: https://100din100.netlify.app
int x; //vom afla a 4-a cifră de la coadă — adică a doua//pentru mai multe detalii: https://100din100.netlify.app
//din față//pentru mai multe detalii: https://100din100.netlify.app
while(x) {
	x--;
	n = n / 10;
}
cout<<n % 10; //se va afişa 2//pentru mai multe detalii: https://100din100.netlify.app
						

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)//pentru mai multe detalii: https://100din100.netlify.app
	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.//pentru mai multe detalii: https://100din100.netlify.app
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!

//pentru mai multe detalii: https://100din100.netlify.app

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;//pentru mai multe detalii: https://100din100.netlify.app
	o prelucrăm;
	o tăiem din număr; //n = n / 10;//pentru mai multe detalii: https://100din100.netlify.app
}
					

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//pentru mai multe detalii: https://100din100.netlify.app
	//pt că pentru 0, sum va fi tot 0.//pentru mai multe detalii: https://100din100.netlify.app
	int cif = n % 10; //nu este necesar să salvăm într-o variabilă//pentru mai multe detalii: https://100din100.netlify.app
	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.//pentru mai multe detalii: https://100din100.netlify.app
	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ă//pentru mai multe detalii: https://100din100.netlify.app
	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ăspunsul

//pentru mai multe detalii: https://100din100.netlify.app

Completează următoarea secvență de cod:

//calculează suma cifrelor lui n
int s = 0;
while(n) {
s += % 10;
n /= 10;
}
· Vezi răspunsul

//pentru mai multe detalii: https://100din100.netlify.app

Completează următoarea secvență de cod:

//calculează produsul cifrelor lui n
int p = ;
do {
p *= n % 10;
n /= 10;
} while(n);
· Vezi răspunsul

//pentru mai multe detalii: https://100din100.netlify.app

Alte resurse şi bibliografie

  1. Tutoriale-Pe.net
  2. pbinfo (prezintă şi nişte aplicații mai interesante :) )

Alte articole

Primul tau program, variabile si operatii - TUTORIAL COMPLET C++

Eşti elev de liceu şi nu înțelegi informatica? Acest clip ar trebui să te ajute să înțelegi cele mai elementare aspecte privind informatica de liceu - algoritmica...

Rezolvări probleme PbInfo

Problemele de informatică pot fi dificile uneori, şi este util să vedem o soluție bună pentru a ne autoverifica. De multe ori sunt necesare doar nişte modificări minore, de aceea este bine să analizăm soluțiile bune cu atenție!

Video - Probleme Rezolvate PbInfo

Aici gasiti rezolvarea mai multor probleme de pe site-ul pbinfo.ro, în format video, pe canalul nostru de YouTube.

Parcurgerea matricei in spirala in C++

Cu ce ne ajută parcurgerea matricei pătratice în spirală? În concursuri şi olimpiade apar probleme legate de parcurgerea matricei în spirală. Deşi ideea de bază este destul de uşoară, algor…

Sortarea vectorilor si a structurilor (pentru incepatori) in C++

Sortarea în informatică reprezintă procesul de a ordona un şir de obiecte (numere, caractere, sau chiar şiruri) după un anumit criteriu. Spre exemplu, putem ordona crescător sau descrescăto…

Verifica daca un an este bisect in C++

Dându-se un an, trebuie verificat dacă este un an bisect sau nu. Exemplu:Intrare 2021 Ieşire NU Definiția anului bisect Deşi pare evident, anii bis…

Cautarea binara pentru olimpiada in C++

Ce este căutarea binară? Să zicem că ai un vector a[] cu n elemente crescătoare. Căutarea binară este un algoritm eficient care determină dacă orice număr x apare sau n…

Afişare cu 2 zecimale exacte, fără şi cu rotunjire - TUTORIAL C++

Tutorialul acesta te învață cum să afişezi un număr real cu mai multe zecimale exacte. Multe probleme cer...

Algoritmi elementari - video

Tutoriale uşor de urmărit, sub forma unor videoclipuri!

Vectori caracteristici si vectori de frecventa - Materie Olimpiada Informatica C++

Ce este un vector de frecvență sau un vector caracteristic? Vectorii caracteristici rețin dacă un element se află într-un vector sau nu. Similar, vectorii de frecvență rețin numărul de apar…

Tablelul ASCII - clasa a X-a - char C++

Ce este tabelul ASCII? Calculatorul reține numere (valori de 1 şi de 0), aşadar a fost nevoie de o corespondență între numere şi caractere pentru a putea reprezenta litere, si…

Tipuri de date in C++ si C - Tutorial Incepatori

De ce avem nevoie de date? În timp ce lucrăm cu valori, avem nevoie (uneori chiar suntem siliți!) să memorăm datele undeva, în memorie. Prin intermediul variabilelor putem accesa o zonă de …

Verifica daca o data este valida in C++

Dându-se o dată (zi lună an), trebuie verificat dacă data este validă sau nu. Exemplu:Intrare zi = 3, luna = 4, an = 2021 Ieşire DA Pentru a verifica da…

Primul program - Operatori si expresii - Tutorial incepatori C++

Alcătuirea unui program pentru rezolvarea unei probleme se rezumă defapt la rezolvarea unor probleme mai mici. Spre exemplu, pentru a afla suma numerelor prime dintr-un şir, trebuie să ştim cum …

Sume partiale. Suma elementelor dintr-o submatrice in C++

Cu ce ne ajută sumele parțiale? Unele probleme cer aflarea sumei elementelor unei secvențe dintr-un şir dat. Metoda naivă, care face suma tuturor elementelor din secvența cerută, deobicei n…

Smenul lui Mars (Difference Arrays) in C++

Ce este Şmenul lui Mars? Să zicem că avem un şir a[] cu n elemente. Unele probleme cer efectuarea unor operații de tipul sum(st, dr, val), cu semnificația că adunăm la …

Ce este coada/queue si cum functioneaza? Tutorial clasa a 10-a

Ce este coada? Coada (Queue din engleză) este o structură de date liniară care funcționează prin inserarea elementelor noi la spate şi prin eliminarea elementelor doar prin față. Altfel spu…

Divizorii unui numar - tutorial incepatori in C++

Prezentul articol te va ajuta să îndeplineşti diferite aplicații cu divizorii unui număr. Trebuie cunoscută parcurgerea divizorilor unui număr, înainte de toate, ca să ne asigurăm că ştim s…

Citirea si Afisarea in fisiere in C++ - Tutorial Incepatori

De ce citirea din fişier? De multe ori este necesară citirea şi afişarea în fişier, unul din motive fiind faptul că nu trebuie să reintroducem datele de intrare de fiecare dată când rulăm p…

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 cif…

Ridicarea la putere in timp logaritmic pentru olimpiada in C++

Un număr de forma b la puterea e nu poate fi calculat precum celelalte operații (adunarea, scăderea, înmulțirea, împărțirea) pur şi simplu. În articolul acesta vom prezenta un mod foarte …

Creeaza un joc 2D in PYTHON pentru incepatori - Capitolul 0 (Instalare)

Care-i faza? În aceste câteva tutoriale vom învăța cum să îți creezi propriul joc video în Python. Puteți viziona atât pe YouTube, cât şi în format text pe site-ul nostru (aici adică). …

Al doilea cel mai mic/mare element al unui sir in C++

Dându-se un şir de numere naturale distincte, aflați al doilea cel mai mic număr din şir. Exemplu:Intrare 9 5 8 2 4 Ieşire 4 Explicație4 este al doilea cel mai mi…

Ciurul lui eratostene - generarea numerelor prime - olimpiada C++

Să zicem că vrem să aflăm dacă mai multe numere sunt sau nu prime. Desigur, putem aplica algoritmul de aflare a numărului de divizori pentru toate numerele, doar că dacă avem foarte multe şi sun…

Învață să programezi gratis!

Am lansat InfoAs, o platformă de informatică cu sute de probleme, lecții și concursuri, totul gratuit. Încearcă acum!