Probleme simple cu cifrele unui număr în C++

Probleme simple cu cifrele unui număr în C++

Problemele cu cifrele unui număr natural sunt printre primele teme abordate la începutul studiului informaticii la școală. Deși par aproape inutile, problemele cu cifrele unui număr au rolul de a te obișnui cu împărțirea întreagă (ce presupune obținerea unui cât și a unui rest) și cu reprezentarea numerelor în baza 1010 Soluțiile sunt foarte scurte, așa că sper că nu e nevoie să scriu programele complete, ci doar secvențele de cod importante.

Problema 1.

Se dă un număr natural nn 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 a0a1am1\overline{a_0 a_1 \ldots a_{m - 1}} este egal cu a010m1+a110m2++am1100a_0 \cdot 10^{m - 1} + a_1 \cdot 10^{m - 2} + \cdots + a_{m - 1} \cdot 10^0 Observăm că, din această sumă, doar ultimul termen (care reprezintă ultima cifră) nu este un multiplu nenul de 1010 așa că prin împărțirea numărului la 1010 restul obținut va fi chiar ultima sa cifră.

int lastDigit = n % 10;

Problema 2.

Se dă un număr natural nn 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 1010 din care se deduce că împărțirea lui nn la 1010 va produce câtul a010m2+a110m3++am2100a_0 \cdot 10^{m - 2} + a_1 \cdot 10^{m - 3} + \cdots + a_{m - 2} \cdot 10^0 Fiecare termen devine de 1010 ori mai mic, iar ultimul dispare, numărul obținut find practic cel cerut.

int lastDigitCut = n / 10;

Problema 3.

Se dă un număr natural nn Să se afișeze numărul format din ultimele kk cifre ale lui nn

Vom generaliza problema 1. Restul împărțirii lui nn la 1010 este ultima sa cifră, restul împărțirii lui nn la 100100 este numărul format din ultimele sale două cifre etc. Așadar, trebuie să calculăm restul împărțirii lui nn la 10k10^k

int p = 1;
for (int i = 0; i < k; i++)
p *= 10;
cout << n % p << '\n';

Problema 4.

Se dă un număr natural nn Să se afișeze numărul format prin eliminarea ultimelor kk cifre ale lui nn

Procedăm ca la problema 2. Dacă restul împărțirii lui nn la 10k10^k este numărul format din ultimele kk cifre, atunci câtul împărțirii este numărul format prin eliminarea acelor cifre.

int p = 1;
for (int i = 0; i < k; i++)
p *= 10;
cout << n / p << '\n';

Problema 5.

Se dă un număr natural nn Să se afișeze a kka cifră a sa, considerându-le numerotate de la 11 de la stânga la dreapta.

Folosind ce am învățat până acum, putem calcula numărul format din primele kk cifre (prin eliminarea ultimelor mkm - 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';

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;
// Nu are rost să punem else pentru că oricum
// dacă n == 0 nu se intră în while.
while (n) {
nrDigits++;
n /= 10;
}
cout << nrDigits << '\n';

Totuși, if-ul ăla este cam enervant. Îl putem evita folosind structura do while:

int nrDigits = 0;
do {
nrDigits++;
n /= 10;
} while (n);
cout << nrDigits << '\n';

Dacă n0n \neq 0 do while-ul va face exact aceeași pași ca while-ul de la început, singura diferență fiind momentul la care se testează condiția. Dacă n=0n = 0 se incrementează numărul de cifre, nn se împarte la 1010 obținând tot 00 și se iese din do while. Rezultatul va fi așadar 11 ceea ce este corect.

Se observă că, la final, în nn nu vom mai avea stocată valoarea inițială a numărului, ci 00 Dacă avem nevoie de aceasta și după calculul numărului de cifre, îi putem face la început o copie în variabila cpycpy și să o prelucrăm în schimb pe aceasta.

int cpy = n;
int nrDigits = 0;
do {
nrDigits++;
cpy /= 10;
} while (cpy);
cout << nrDigits << '\n';

Problema 7.

Se dă un număr natural nn Să se calculeze suma cifrelor acestuia.

În multe probleme cu cifrele unui număr se folosește șablonul de la problema anterioară. Înainte de eliminarea ultimei cifre de la fiecare pas, o putem prelucra accesând-o prin n % 10. În cazul nostru, prelucrarea înseamnă să o adăugăm la sumă.

int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
cout << sum << '\n';

Problema 8.

Se dă un număr natural nn Să se afișeze cifra sa maximă.

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';

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';

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 00ul 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';

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 (10i\htmlClass{katexified}{(} 10^i La fiecare pas vom înmulți cifra curentă xx cu această putere, adăugând la finalul său ii zerouri (i\htmlClass{katexified}{(} i fiind egal și cu numărul de cifre ale lui nn la pasul respectiv). Astfel, putem adăuga nnul 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';

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';

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.

Cu alte cuvinte, nn este palindrom dacă nn este egal cu răsturnatul său. Vom reține o copie a lui nn pe care o vom prelucra pentru a obține răsturnatul (m\htmlClass{katexified}{(} m Apoi, testăm egalitatea dintre nn și mm

int m = 0;
int cpy = n;
while (cpy) {
m = m * 10 + cpy % 10;
cpy /= 10;
}
if (n == m)
cout << "DA\n";
else
cout << "NU\n";

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';

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";

Acestea sunt cele mai clasice exerciții cu cifrele unui număr; important este să rețineți cum se extrag cifrele dintr-un număr. Puteți exersa astfel de probleme pe PbInfo; acolo se găsesc și o parte din cele prezentate în acest articol. Dacă aveți vreo problemă legată de cifrele unui număr care vă dă bătăi de cap, nu ezitați să o lăsați într-un comentariu mai jos, pentru a vă ajuta :smile:

Mulțumesc că ai citit acest articol.
Dacă vrei să susții blogul, poți cumpăra un abonament de 2$.

patreon

Lasă un comentariu!

0 comentarii