Documente Academic
Documente Profesional
Documente Cultură
Problema 1.
Se dă un număr natural n. Să se afișeze ultima sa cifră.
Cam la asta se reduc majoritatea problemelor cu cifrele unui număr. Un număr natural
de forma a0a1…am−1 este egal cu a0⋅10m−1+a1⋅10m−2+⋯+am−1⋅10. Observăm
că, din această sumă, doar ultimul termen (care reprezintă ultima cifră) nu este un
multiplu nenul de 10, așa că prin împărțirea numărului la 10, restul obținut va fi chiar
ultima sa cifră.
Problema 2.
Se dă un număr natural n. Să se afișeze numărul format prim eliminarea ultimei sale
cifre.
Ne vom folosi din nou de forma unui număr natural scris în baza 10, din care se deduce
că împărțirea lui nn la 10 va produce câtul a0⋅10m−2+a1⋅10m−3+⋯+am−2⋅10 la
putere 0. Fiecare termen devine de 10 ori mai mic, iar ultimul dispare, numărul
obținut find practic cel cerut.
Problema 3.
Se dă un număr natural n. Să se afișeze numărul format din ultimele k cifre ale lui n.
Folosind ce am învățat până acum, putem calcula numărul format din primele kk cifre
(prin eliminarea ultimelor m−km−k). Din acesta avem nevoie doar de ultima cifră, deci
îi calculăm restul împărțirii la 1010.
int p = 1;
for (int i = 0; i < m - k; i++)
p *= 10;
cout << n / p % 10 << '\n';
Copy
Problema 6.
Se dă un număr natural nn. Să se calculeze numărul lui de cifre.
Soluția este să împărțim numărul la 1010 până când acesta devine 00, iar la fiecare pas
să incrementăm numărul de cifre. De exemplu, la pasul 00 avem numărul 618618, la
pasul 11 avem 6161, la pasul 22 avem 66, la pasul 33 avem 00, iar aici ne oprim.
Numărul de cifre ale lui 618618 este 33. Vom trata separat cazul n=0n=0, pentru că
dacă numărul este 00 din start, nu s-ar mai intra în while.
int nrDigits = 0;
if (!n)
nrDigits = 1;
Din nou, eliminăm pe rând ultima cifră a lui nn până când acesta devine 00, iar la
fiecare pas actualizăm maximul.
int max = 0;
while (n) {
if (n % 10 > max)
max = n % 10;
n /= 10;
}
cout << max << '\n';
Copy
Problema 9.
Se dă un număr natural nn. Să se determine prima sa cifră (cea mai semnificativă
cifră).
Putem extrage câte o cifră din nn până când nn devine mai mic decât 1010, adică până
când nn devine o cifră. Aceasta va fi, evident, ultima cifră a lui nn.
while (n > 9)
n /= 10;
cout << n << '\n';
Copy
Problema 10.
Se dau kk cifre. Să se construiască numărul natural nn format din aceste cifre în
ordinea în care sunt date.
La fiecare cifră citită îl vom înmulți pe nn cu 1010, pentru a-i face loc cifrei curente, xx.
După înmulțire, nn va avea un 00 la final, iar adunând xx, 00-ul va deveni xx.
int k; cin >> k;
int n = 0;
for (int i = 0; i < k; i++) {
int x; cin >> x;
n = n * 10 + x;
}
cout << n << '\n';
Copy
Problema 11.
Se dau kk cifre. Să se construiască numărul natural nn format din aceste cifre în
ordinea inversă celei în care sunt date.
Procedăm aproape ca la problema anterioară, numai că vom reține pe parcurs și o
putere a lui 1010 (10i10i). La fiecare pas vom înmulți cifra curentă xx cu această
putere, adăugând la finalul său ii zerouri (ii fiind egal și cu numărul de cifre ale lui nn la
pasul respectiv). Astfel, putem adăuga nn-ul vechi la acest număr, formând un nou nn.
int k; cin >> k;
int n = 0;
for (int i = 0, p = 1; i < k; i++, p *= 10) {
int x; cin >> x;
n = x * p + n;
}
cout << n << '\n';
Copy
Problema 12.
Se dă un număr natural nn. Să se calculeze răsturnatul (oglinditul) său. Răsturnatul
unui număr este numărul format prin scrierea în ordine inversă a cifrelor sale. De
exemplu, răsturnatul lui 618618 este 816816.
Aici vom combina problemele 7 și 10. Pe măsură ce eliminăm câte o cifră din nn, o
adăugăm la răsturnatul lui nn, pe care îl vom nota cu mm.
int m = 0;
while (n) {
m = m * 10 + n % 10;
n /= 10;
}
cout << m << '\n';
Copy
Problema 13.
Se dă un număr natural nn. Să se determine dacă nn este un palindrom. Un număr
palindrom este un număr care citit atât de la dreapta la stânga, cât și de la stânga la
dreapta, este același.
while (cpy) {
m = m * 10 + cpy % 10;
cpy /= 10;
}
if (n == m)
cout << "DA\n";
else
cout << "NU\n";
Copy
Problema 14.
Se dă un număr natural nn. Să se determine cifra de control a lui nn. Cifra de control
a unui număr este cifra de control a sumei cifrelor sale, dacă numărul are măcar două
cifre. Altfel, este chiar numărul în sine.
Cam așa sună o definiție recursivă a cifrei de control. Altfel spus, cât timp nn nu este o
cifră, nn devine suma cifrelor lui nn. La final, răspunsul va fi nn.
int sum;
while (n > 9) {
sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
n = sum;
}
cout << n << '\n';
Copy
Dar putem găsi o soluție ceva mai eficientă. Se poate observa că dacă nn are cifra de
control cc, atunci toate numerele naturale de forma n+9kn+9k, cu kk întreg, au și ele
cifra de control cc. Asta înseamnă că cifra de control a lui nn este restul împărțirii sumei
cifrelor sale la 99 dacă restul este nenul, sau 99 în caz contrar.
int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
if (sum % 9)
cout << sum % 9 << '\n';
else
cout << "9\n";
Care dintre cifrele sale poate fi determinată cu o simplă operație aritmetică? Constatăm că
putem determina ultima cifră a numărului cu operația C++ % 10 – restul împărțirii la 10. Într-
adevăr, 274 % 10 este 4, adică ultima cifră (a unităților) a lui 274.
Cum putem determina cifra zecilor? Sigur, o soluție ar fi n % 100 / 10. Într-adevăr, n %
100 este 74, iar 74 /10 este 7. Ne amintim că, dacă operanzii sunt întregi,
operația / reprezintă câtul împărțirii întregi.
Dar mai există o variantă, mai utilă pe termen lung :). Știm că n % 10 reprezintă cifra
unităților lui n și vrem să determinăm cifra zecilor. Putem să modificăm mai întâi valoarea
lui n, astfel: n = n / 10, și să determinăm ultima cifră a acestui număr. Este cifra unităților
pentru valoarea curentă a lui n și cifra zecilor pentru valoarea inițială.
int n = 274;
cout << n % 10; // se va afisa 4
n = n / 10; // n devine 27
cout << n % 10; // se va afisa 7
Vom numi trunchiere operația prin care se elimină ultima cifră a valorii unei variabile
întregi. Pentru a realiza trunchierea, folosim operația de atribuire și împărțirea la 10: n =
n / 10 sau n /= 10.
Cum aflăm cifra sutelor? Trunchiem încă o dată valoarea lui n. n devine 2, iar n %
10 este 2, adică cifra sutelor pentru valoarea inițială a lui n. Mai mult, acum n are o singură
cifră, și printr-o nouă trunchiere devine 0.
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n != 0) // cat timp n este nenul - mai are cifre
{
int uc = n % 10; //determinam ultima cifra a lui n
cout << uc << " "; // prelucram ultima cifra
n /= 10; // eliminam ultima cifra (trunchiem numarul)
}
return 0;
}
Observații:
4 7 2
pornim de la valoarea R = 0;
cifrele se adaugă în ordine:
o la sfârșitul lui R
o la începutul lui R
1. R = 0
2. c = 2. R = 10 * R + c, adică R devine 10 * 0 + 2 = 2
3. c = 8. R = 10 * R + c, adică R devine 10 * 2 + 8 = 28
4. c = 5. R = 10 * R + c, adică R devine 10 * 28 + 5 = 285
5. c = 3. R = 10 * R + c, adică R devine 10 * 285 + 3 = 2853
1. R = 0
2. c = 2. R = R + 1 * c, adică R devine 0 + 1 * 2 = 2
3. c = 8. R = R + 10 * c, adică R devine 2 + 8 * 10 = 82
4. c = 5. R = R + 100 * c, adică R devine 82 + 100 * 5 = 582
5. c = 3. R = R + 1000 * c, adică R devine 582 +1000 * 3 = 3582
Ambele metode folosesc de fapt scrierea zecimală a numărului:
Pe de altă parte:
2853 =
285 * 10 +3 =
(28*10 + 5) * 10 +3 =
((2 * 10 + 8)*10 + 5) * 10 +3 =
(((0 * 10 + 2) * 10 + 8)*10 + 5) * 10 +3
În practică, cifrele cu care se construiește numărul pot să provină din diverse surse. O
situație frecventă este construirea unui număr folosind cifrele altui număr cunoscut.
Exemple
Exemplul 1: Determinarea oglinditului unui număr dat
Prin oglinditul (inversul) unui număr se înțelege un numărul scris cu cifrele numărului inițial,
în ordine inversă. De exemplu, oglinditul lui 274 este 472, iar oglinditul lui 1300 este 31 –
numerele nu pot să înceapă cu cifra 0.
Rezolvare:
Program C++:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int ogl= 0;
while(n){
ogl =10*ogl + n%10;
n /= 10;
}
cout << ogl << endl;
return 0;
}
Rezolvare: Vom determina cifrele numărului dat și vom construi rezultatul, inserând cifrele
la început. Cifrele pare se inserează ca atare, cifrele impare se inserează micșorate.
Program C++
#include <iostream>
int main()
{
int n , R = 0, p = 1;
std :: cin >> n;
while(n)
{
int uc = n % 10;
if(uc % 2 == 0)
R += p * uc;
else
R += p * (uc - 1);
p *= 10;
n /= 10;
}
std :: cout << R << std :: endl;
return 0;
}
Se citesc două numere x şi y, cu cel mult 4 cifre fiecare. Să se afişeze numărul obţinut prin
concatenarea cifrelor lui y cu cifrele lui x. Exemplu:x=1234 şi y=5678, se obţine numărul 12345678.
#include<iostream>
using namespace std;
int main()
{
int x,y,invy;
cout<<"x=";cin>>x;
cout<<"y=";cin>>y;
invy=0;
while(y!=0)
{
invy=invy*10+y%10;
y=y/10;
}
while(invy!=0)
{
x=x*10+invy%10;
invy=invy/10;
}
cout<<x;
}
char s[MAX];
void afisare(NrMare x)
Dupa care parcurgem cifrele in ordinea inversa, iar atunci cand gasim o diferenta,
returnam numarul mai mare.
return -1;
else
return +1;
return -1;
else
return +1;
return 0;
Suma ar putea avea o cifra in plus fata de cel mai mare dintre cele doua numere
(daca la sfarsit cifra in plus este nenula). Functia suma() va avea ca parametri
cele doua numere mari care se aduna si numarul mare rezultat.
int t = 0, max;
max = b[0];
a[i] = 0;
else
max = a[0];
int i;
t = cifra/10;
if(t)
rezultat[i] = t;
else
i--;
rezultat[0] = i;
Diferenta ar putea avea mai putine cifre decat descazutul, astfel incat la sfarsit
calculam numarul de cifre din diferenta, ignorand zerourile nesemnificative.
else
int i, t = 0;
if(rezultat[i] < 0)
rezultat[i] += 10;
t = -1;
else
t = 0;
i--;
i--;
rezultat[0] = i;