Documente Academic
Documente Profesional
Documente Cultură
if (n == 0) prelucrare_caz_special()
while (n > 0)
{
cif = n%10;
..... //operatii care prelucreaza conform problemei cifra determinata
n = n / 10;
}
1. S se determine pentru un numr ntreg x cu cel mult 9 cifre citit de la
tastatur:
a. suma cifrelor
b. produsul cifrelor
c. numrul cifrelor sale
a.calcularea numarului de cifre:
nrcifre = 0;
if (n == 0) nrcifre = 1;
while (n > 0)
{
nrcifre++;
n = n / 10;
}
b. determinarea primei cifre
if (n == 0) primacif = 0;
while (n > 9)
n=n / 10;
primacif = n;
c. determinarea oglinditului (de ex., oglinditul numarului 12345 este 54321)
ogl = 0;
while (n > 0)
{
cif = n % 10;
ogl = ogl * 10 + cif;
n = n / 10;
}
2. S se determine inversul(oglinditul) unui numr ntreg x cu cel mult 9 cifre
citit de la tastatur.
Exemplu. Pentru x=1234 se afieaz 4321
while (n > 0)
{
cif = n / p;
//prelucreaza cifra cif;
n = n % p;
p = p / 10;
}
3. S se afieze pentru un numr ntreg x cu cel mult 9 cifre citit de la
tastatur numrul obinut prin eliminarea cifre de pe poziia k
a. Numrarea ncepe de la dreapta la stnga
b. Numrarea ncepe de la stnga la dreapta
Calculai cifra k a unui numr n, numrnd cifrele de la dreapta la stnga
while ( k > 1 )
{
n = n / 10;
k--;
}
cf = n % 10;
e. numararea aparitiilor cifrei K
nrap = 0;
if (n == 0 && k == 0) nrap = 1;
while (n>0)
{
cif = n % 10;
if (cif == k) nrap++;
n = n / 10;
}
f. eliminarea cifrelor pare
p = 1; nr = 0;
while (n>0)
{
cif = n % 10;
if(cif % 2 != 0)
{
nr = nr + cif*p;
p = p * 10;
}
n = n / 10;}
4. S se determine pentru un numr ntreg x cu cel mult 9 cifre citit de la
tastatur numrul obinut din cifrele sale pare n ordinea n care acestea
apar n numrul iniial.
Exemplu. pentru x=34567 se obine 46
5. Fie un numr natural x cu cel mult 4 cifre. S se insereze nainte de fiecare
cifr par urmtoarea cifr.
Exemplu. pentru x=5672 se obine 576732
6. Fie un numr natural x cu cel mult 4 cifre. S se dubleze apariia fiecrei
cifre pare n numrul x.
Exemplu. pentru x=5672 se obine 566722
if (n < 2) prim = 0;
else
{ prim = 1; //presupunem ca n este prim
for (d = 2; d * d <= n; d++)
if (n % d == 0) {prim = 0; break;}
if (prim == 1) .... //operatiile de efectuat cand n este prim
}
7. S se determine cte cifre care reprezint numere prime are un numr x
citit de la tastatur.
Exemplu. pentru n=524789 se afieaz 3.
3. cmmdc(a,b)
rest = a % b;
while (rest != 0)
{ a = b;
b = rest;
rest = a % b;}
cmmdc = b;
Atentie! Ca sa calculati cel mai mic multiplu comun, trebuie sa calculati
cmmdc si sa aplicati formula cmmmc=(ca*cb)/cmmdc; unde ca=a; cb=b;
copiile valorilor initiale, facute inainte de a calcula cmmdc
8. S se determine cel mai mare divizor comun a dou numere ntregi nenule
x, y.
a. prin scderi repetate
b. prin mpriri repetate (algoritmul lui Euclid)
c. s se determine dac cele dou numere sunt prime ntre ele
S se determine cel mai mare divizor comun a 3 numere ntregi nenule x, y, z
citite de la tastatur.
4. Determinarea divizorilor proprii ai lui n
d=2;
while (n>1)
{
m = 0;
if(n%d==0)
cout<<d<<' ';
while ( n % d == 0)
{
m++;
n = n / d;
}
if (m>0) cout<<m<<' '<<endl;//operatii care trebuie efectuate cu divizorul
prim d la puterea m
d++;
}
Optimizare:
Ideea rezolvrii const n existena unui singur factor prim mai mare dect radicalul numrului.
#include <iostream>
using namespace std;
int main() {
int n,div,exp;
cin>>n;
div = 2; //Incepem cautarea factorilor primi de la primul numar prim
//Cautam factorii primi pana la radicalul numarului
while (div * div <= n) {
exp = 0;
while (n % div == 0) {
n = n / div;
++exp;
}
if (exp > 0)
cout<<"Factor prim "<<div<<" la puterea"<<exp;
++div;
}
//In cazul in care mai exista un factor prim, acesta este chiar
//numarul ramas
if (n != 1)
cout<<" Factor prim "<<n<<" la puterea 1";
return 0;
}
11.S se determine suma exponenilor factorilor care intervin la descompunerea n
factori primi a numrului x natural cu cel mult nou cifre. Pe baza rezultatului
determinai dac numrul x este numr prim.
Exemplu. pentru x=9800 (23 * 52* 72) se afieaz 7 (3+2+2). Nu este numr
prim. Pentru x=23 se afieaz 1. Este numr prim.
fin>>n;
f0 = f1 = 1;
while (f0+f1 <= n)
{
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
Prelucreaza f1
12.S se afieze primii n termeni din irul lui Fibonacci, unde n este numr
natural citit de la tastatur.
9. Cifra de control a lui n
if (n == 0) cifc = 0;
else
if (n % 9 == 0) cifc = 9;
else cifc = n % 9;
13.S se afieze pentru un numr ntreg x cu cel mult 9 cifre citit de la
tastatur cifra de control (cifra care se obine adunnd cifrele numrului
pn se obine o singur cifr).
Exemplu. pentru x=55566577 se obin sumele 46, apoi 10, apoi 1. Cifra de
control este 1.
c = x % 10;
if (y % 4 == 1) ucif = c;
else if (y % 4 == 2) ucif = (c*c)%10;
else if (y % 4 == 3) ucif = (c*c*c)%10;
else if (y % 4 == 0) ucif = (c*c*c*c)%10;
Putere
Calculai an n mod ct mai eficient (a i n numere naturale). Problema este cunoscut i sub numele
de ridicare la putere n timp logaritmic. Ideea din spatele acestei rezolvri este urmtoarea:
Dac n este impar, atunci n-1 este par i avem an = a * an-1 = a * a2*(n-1)/2 = a * (a2)(n-1)/2 = a *
2 n/2
(a )
n formulele de mai sus am considerat c / este mprirea ntreag din limbajul C++. Se observ c
indiferent de paritatea lui n, la fiecare pas al iteraiei putem transforma a n a * a i apoi putem
mpri n la 2. Doar n cazurile cnd n este impar vom acumula valoarea curent a lui a la produsul
calculat. Iat soluia bazat pe aceast idee:
#include <iostream>
using namespace std;
int main() {
int a, n,p;
cin>>a>>n;
p = 1;
while (n > 0)
{
if (n % 2 == 1)
p = p * a;
a = a * a;
n = n / 2;
}
cout<< p;
return 0;}
fin>>n;
fin>>a;
for (i=2; i<=n; i++)
{ fin>>b;
.... //operatii care prelucreaza perechea formata din a si b
a=b;}
13. Citirea pe rand a n numere si determinarea minimului / maximului
acestora
fin>>n;
fin>>a;
min=a; //presupunem ca minimul este primul element
for (i=2; i<=n; i++)
{fin>>a;
if (min<a) min=a; //pentru maximul a n numere, in loc de (min<a) va fi
(max>b)}
15.Pentru n (n100) numere ntregi x cu cel mult 4 cifre fiecare citite de la
tastatur s se determine:
a. valoarea minim citit
b. valoarea maxim citit i de cte ori apare aceast valoare n irul
valorilor citite
c. cel mai mare numr par
d. valoarea x cu cea mai mare sum a cifrelor. Dac sunt mai multe astfel
de numere (cu aceeai sum a cifrelor) se va afia cel cu valoarea cea
mai mic.