Algoritmul de prelucrare a cifrelor unui numar, obtine intotdeauna ultima cifra a numarului curent ca fiind restul impartirii la 10 (cifra = n % 10), iar apoi elimina aceasta cifra din numar (n = n / 10). Algoritmul continua cat timp n > 0. Forma generala este:
while (n)
{
cifra = n % 10;
Prelucrare cifra
n = n / 10;
}
Problemele ce privesc generarea unui numar plecand de la un numar dat, se clasifica in general in doua categorii:
Determinarea unui nou numar (m), pornind de la cifrele numarului initial (n), avand cifrele in ordine inversa fata de cel initial. Ex: construirea oglinditului unui numar.
n = 123 => m = 321
321 = 3 * 102 + 2 * 101 + 1 * 100 = ((0 * 10 + 3) * 10 + 2) * 10 + 1 <=> m = m * 10 + n % 10
int m = 0; //se initializeaza noul numar cu 0
while (n)
{
m = m * 10 + n % 10;
n = n / 10;
}
Determinarea unui nou numar (m), pornind de la cifrele numarului initial (n), avand cifrele in aceeasi ordine cu cel initial. Ex: construirea unui numar format prin eliminarea primei cifre.
n = 1234 => m = 234
234=2 * 102 + 3 * 101 + 4 * 100 = 4 * 1 + 3 * 10 + 2 * 100 <=> m = m + n % 10 * p; p = p * 10;
int m = 0, p = 1; //se initializeaza noul numar cu 0; variabila p va retine puterile lui 10
while (n > 9)
{
m = m + n % 10 * p;
p = p * 10;
n = n / 10;
}
Probleme rezolvate
Sa se scrie o functie care returneaza suma cifrelor unui numar trimis ca parametru.
Sursa
int sumaCifre (int n)
{
int s = 0;
while (n)
{
s += n % 10;
n /= 10;
}
return s;
}
Sa se scrie o functie care returneaza numarul cifrelor unui numar trimis ca parametru.
Sursa
int numarCifre (int n)
{
int nrCif = 0;
while (n)
{
nrCif++;
n /= 10;
}
return nrCif;
}
Sa se scrie o functie care returneaza inversul unui numar trimis ca parametru.
Sursa
int invers (int n)
{
int m = 0;
while (n)
{
m = m * 10 + n % 10;
n = n / 10;
}
return m;
}
Sa se scrie o functie care verifica daca un numar este palindrom. Un numar este palindrom daca este egal cu oglinditul sau. (Ex.: 12321)
Sursa
int palindrom(int n)
{
if (n == invers(n))
return 1;
return 0;
}
int fact(int x)
{
int p = 1;
for (int i = 1; i <= x; i++)
p *= i;
return p;
}
int sumfactcif(int x)
{
int s = 0;
if (x == 0)
return 1;
while (x)
{
s += fact(x % 10);
x /= 10;
}
return s;
}
Să se scrie o funcție C++ care să determine cea mai mare și cea mai mică cifră a unui număr natural transmis ca parametru. Funcția va întoarce rezultatele prin intermediul unor parametri de ieşire.#894CifMinMaxhttps://www.pbinfo.ro/?pagina=probleme&id=894
Sursa
void cifminmax(int n, int &max, int &min)
{
int c;
max = 0, min = 9;
if(n == 0)
min = 0;
while (n > 0)
{
c = n % 10;
if (min > c)
min = c;
if (max < c)
max = c;
n = n / 10;
}
}
Sa se scrie o functie care primeste ca parametru un numar si apoi returneaza tot prin intermediul aceluiasi parametru numarul obtinut prin eliminarea primei si ultimei cifre a numarului initial. Ex: n = 12345; Nr(n); => nr = 234
Sursa
#include <iostream>
using namespace std;
void Nr (int &n)
{
int m = 0, p = 1;
n = n / 10; //am eliminat cifra unitatilor
while (n > 9) //cat timp numarul are mai mult de 1 cifra
{ //construiesc un numar nou fara acea cifra
m = m + n % 10 * p;
p = p * 10;
n = n / 10;
}
n = m;
}
int main ()
{
int n;
cin >> n;
Nr(n);
cout << n;
}
Să se scrie un subprogram C++ prin care se dublează prima cifră a unui număr natural n transmis ca parametru. Funcția întoarce rezultatul prin intermediul aceluiași parametru n. #1633 Dublare1https://www.pbinfo.ro/?pagina=probleme&id=1633
Sursa
void dublare1(int &nr)
{
int x, p = 1;
x = nr;
while (x > 9)
{
x = x / 10;
p = p * 10;
}
p = p * 10;
nr = p * x + nr;
}
Sa se scrie o functie numita Par, care sa verifice daca un numar n trimis ca parametru are cel putin o cifra para. Sa se numere cate numere din cele n citite au ultima cifra para si restul impare folosind apeluri succesive al functiei par.
Sursa
#include <iostream>
using namespace std;
int par (int n)
{
while (n)
{
if (n % 2 == 0)
return 1;
n = n / 10;
}
return 0;
}
int main ()
{
int n, m, i, nr = 0;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> m;
if (m % 2 == 0 && !par(m / 10))
nr++;
}
cout << nr;
}
Subprogramul Impare are un singur parametru, n, prin care primește un număr natural. Subprogramul înlocuiește fiecare cifră impară a lui n cu cea mai mare cifră pară strict mai mică decât ea (astfel cifra 1 se înlocuieşte cu cifra 0, cifra 3 cu cifra 2 etc.) și furnizează numărul obținut tot prin parametrul n. #3119 Impare_Bachttps://www.pbinfo.ro/?pagina=probleme&id=3119 Bacalaureat 2019, sesiunea iunie-iulie
Sursa
void Impare(int &n)
{
int c, m = 0, p = 1;
while (n)
{
c = n % 10;
if (c % 2)
c = c - 1;
m = m + c * p;
p = p * 10;
n = n / 10;
}
n = m;
}
#include <iostream>
using namespace std;
int main()
{
int n, c, m = 0, p = 1;
bool ok = 0;
cin >> n >> c;
while (n)
{
if (n % 10 != c) //Construiesc numarul cu cifrele diferite de cifra c
{
m = m + n % 10 * p;
p = p * 10;
ok = 1;
}
n /= 10;
}
if (ok == 0)
cout << -1;
else
cout << m;
}
Se citesc perechi de numere naturale până la citirea a două valori nule. Să se determine câte dintre perechile XY au proprietatea că prin concatenarea lui X cu Y sau a lui Y cu X să se obțină un palindrom. #1410 Numere12https://www.pbinfo.ro/?pagina=probleme&id=1410
Sursa
#include <iostream>
using namespace std;
bool palindrom(long long int n)
{
long long int aux = n, m = 0;
while (aux)
{
m = m * 10 + aux % 10;
aux /= 10;
}
if (n == m)
return 1;
return 0;
}
long long putere(long long n)
{
long long p = 1;
while (n)
{
p = p * 10;
n /= 10;
}
return p;
}
int main()
{
long long x, y, p1, p2, nr = 0, n, m;
cin >> x >> y;
while (x && y)
{
//prelucrare x,y
p1 = putere(x);
p2 = putere(y);
n = x * p2 + y;
m = y * p1 + x;
if (palindrom(n) || palindrom(m))
nr++;
cin >> x >> y;
}
cout << nr;
return 0;
}
Subprogramul Egal are un parametru, n, prin care primește un număr natural cu cel puțin o cifră impară. Subprogramul returnează valoarea 1 dacă toate cifrele impare ale lui n sunt egale între ele sau valoarea 0 în caz contrar. #3104 B_Egal https://www.pbinfo.ro/?pagina=probleme&id=3104 Subiect bacalaureat 2019, sesiunea specială
Sursa
int Egal(int n)
{
int c = 0;
while (n)
{
if (n % 2 == 1) //am gasit o cifra impara
if (c == 0) //este prima cifra impara gasita
c = n % 10; //retin in var. c prima cifra impara gasita
else //cifra impara gasita nu este prima
if (c != n % 10) //cifra impara curenta nu este egala cu prima cifra impara
return 0;
n /= 10;
}
return 1;
}
Fiind date două numere a şi b, îl numim pe a sufix al lui b dacă a este egal cu b sau dacă b se poate obţine din a prin alipirea la stânga a unor noi cifre. Exemplu: 12 este sufix al lui 12, iar 15 este sufix al lui 31415. Sa se scrie o functie care verifica daca a este sufix pentru b.
Sursa
/**
Returneaza 1 daca a este sufix pentru b, sau 0 in caz contrar
*/
int sufix(int a, int b)
{
if (b < a)
return 0;
if (a == b)
return 1;
while (a && a % 10 == b % 10) //impart a si b la 10 cat timp a nu a mai are cifre
a = a / 10, b = b / 10; //si cat timp cifrele sunt egale
return a == 0; //daca la sfarsit a nu este 0, inseamna ca s-a iesit din while cu 2 cifre diferite, deci a nu e sufix pentru b
}
sau
Sursa
/*
Returneaza 10 la puterea numarului de cifre a lui n
*/
int putere(int n)
{
int p = 1;
while (n)
p *= 10, n /= 10;
return p;
}
int sufix(int a, int b)
{
//impart b la 10 la puterea numarului de cifre ale lui n si obtin restul
return a == b % putere(a); //daca ultimele cifre ale lui b sunt egale cu a
}
Fiind date două numere a şi b, îl numim pe a sufix al lui b dacă a este egal cu b sau dacă b se poate obţine din a prin alipirea la stânga a unor noi cifre. Exemplu: 12 este sufix al lui 12, iar 15 este sufix al lui 31415. Sa se scrie o functie care verifica daca a este sufix pentru b. Se dă un număr natural x și un șir de numere naturale. Să se determine ultimul număr din șir care îl care ca sufix pe x. #803 NrSufixhttps://www.pbinfo.ro/?pagina=probleme&id=803 Variante Bacalaureat 2013
Sursa
#include <fstream>
using namespace std;
ifstream fin("nrsufix.in");
ofstream fout("nrsufix.out");
/**
Returneaza 1 daca a este sufix pentru b, sau 0 in caz contrar
*/
int sufix(int a, int b)
{
if (b < a)
return 0;
if (a == b)
return 1;
while (a && a % 10 == b % 10) //impart a si b la 10 cat timp a nu a mai are cifre
a = a / 10, b = b / 10; //si cat timp cifrele sunt egale
return a == 0; //daca la sfarsit a nu este 0, inseamna ca s-a iesit din while cu 2 cifre diferite
}
int main()
{
int n, x, suf = -1;
fin >> n;
while (fin>>x)
if (sufix(n, x))
suf = x;
if (suf == -1)
fout << "nu exista";
else
fout << suf;
return 0;
}
Sursa
#include <fstream>
using namespace std;
ifstream fin("nrsufix.in");
ofstream fout("nrsufix.out");
/*
Returneaza 10 la puterea numarului de cifre a lui n
*/
int putere(int n)
{
int p = 1;
while (n)
p *= 10, n /= 10;
return p;
}
int sufix(int a, int b)
{
//impart b la 10 la puterea numarului de cifre ale lui n si obtin restul
return a == b % putere(a); //daca ultimele cifre ale lui b sunt egale cu a
}
int main()
{
int n, x, suf = -1;
fin >> n;
while (fin>>x)
if (sufix(n, x))
suf = x;
if (suf == -1)
fout << "nu exista";
else
fout << suf;
return 0;
}
Sursa
Pentru a nu calcula de mai multe ori 10 la puterea numarul de cifre ale lui n, se modifica functia main:
int main()
{
int n, x, suf = -1;
fin >> n;
int p = putere(n);
while (fin>>x)
if (n == x % p)
suf = x;
if (suf == -1)
fout << "nu exista";
else
fout << suf;
return 0;
}
Un număr natural este numit echilibrat dacă suma cifrelor sale de pe poziții pare este un număr par, iar suma cifrelor sale de pe poziții impare este un număr impar. Pozițiile cifrelor sunt numerotate de la dreapta la stânga, astfel: cifra unităților este pe poziția 0, cifra zecilor este pe poziția 1 ș.a.m.d. Subprogramul echilibrat are un singur parametru, n, prin care primește un număr natural (n∈[10,109]). Subprogramul returnează valoarea 1 dacă n este echilibrat sau valoarea 0 în caz contrar.
#2798Echilibrathttps://www.pbinfo.ro/?pagina=probleme&id=2798
Subiect Bacalaureat 2018, sesiunea specială
Sursa
/**
* i = pozitia fiecarei cifre
* sP = suma cifrelor de pe pozitii pare
* sI = suma cifrelor de pe pozitii impare
*/
int echilibrat(int n)
{
int sP = 0, sI = 0, i = 0;
while (n)
{
if (i % 2 == 0)
sP += n % 10;
else
sI += n % 10;
i++, n /= 10;
}
return sP % 2 == 0 && sI % 2 == 1;
}
#include <iostream>
using namespace std;
int main()
{
long long n, m, p = 1;
cin >> n;
m = n;
while (m)
m /= 100, p *= 10;
cout << n / p << n % (p / 10);
return 0;
}