Vous êtes sur la page 1sur 7

Algoritmi elementari-Tema

1. Spargerea unui numar in cifre

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

d. generarea cifrelor in ordinea in care apar in numar


p = 1;
while (p * 10 <= n)
p = p * 10;

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

- verificarea lui n daca are un numar impar de divizori (n este patrat


perfect):
sqrt(n) == int(sqrt(n))
- verificarea lui n daca are 3 divizori:
sqrt(n) == int(sqrt(n)) si x=sqrt(n) numar prim (n este patrat perfect
de numar prim)
2. Verificarea daca un numar este prim

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

for(d = 2; d <= n / 2; d++)


if (n % d==0) ... //operatii care trebuie efectuate cu divizorul propriu d
// s = s + d; face suma divizorilor
// nrd++; numara divizorii proprii
9. Dou numere x i y sunt prietene dac unul este egal cu suma divizorilor
celuilalt. S se determine dac dou numere naturale nenule cu cel mult 9 cifre
fiecare sunt prietene.
Exemplu. pentru x=18 i y=39 se afieaz numere prietene deoarece suma
divizorilor lui x=18: 1+2+3+6+9+18=39.
5. Numarul de numere din intervalul [a,b], divizibile cu k (k>0)
Numarul de numere <=n divizibile cu k = n/k
Numarul de numere din [a,b], divizibile cu k = b/k (a-1)/k
Numarul de multipli de a si multipli de b din [1,n] = n/cmmmc(a,b)
Numarul de multipli de a care nu sunt multipli de b din [1,n] = n/a-
n/cmmmc(a,b)
10.S se afieze numerele prime din intervalul [a,b] unde a i b sunt numere
naturale cu cel mult 4 cifre citite de la tastatur.
6. Descompunerea in factori primi. Determinarea divizorilor primi 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:

Afiai descompunerea n factori primi a numrului n. Exemplu: 1176 = 2 3 x 31 x 72. Optimizarea


descompunerii n factori primi.

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.

8. Cel mai mare numar fibonacci mai mic sau egal cu n


Printre infinitatea de iruri existente n lumea matematicii, italianul Leonardo of Pisa, cunoscut i sub
numele de Fibonacci, a descoperit un ir de numere extraordinar de interesant: 0, 1,1, 2, 3, 5, 8, 13,
21, 34, 55, 89, 144, 233, 377, 610, 987, 1597. Formula pe baza cruia se ob ine acest ir este una
foarte simpl
Sirul lui Fibonaci (f n ) n0 este definit prin relatia de recurenta
f n = f n1+ f n2 , f 0 = 0 si f 1 = 1.
Primele dou elemente ale irului sunt 0 i 1, iar al treilea element se ob ine adunndu-le pe primele
dou: 0+1 = 1. Al patrulea se obine adunndu-le pe al treilea cu al doilea (2+1=3). Al cincilea se
obine adunndu-le pe al patrulea cu al treilea (3+2=5), i tot a a, pn la infinit..

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.

10. Ultima cifra a lui x la puterea y (x, y numere naturale, x>0)

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 par, atunci an = a2*n/2 = (a2)n/2

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

11. Citirea pe rand a n numere


fin>>n;
for (i=1; i<=n; i++)
{
fin>>a;
.... //operatii care prelucreaza a cu oricare dintre ceilalti algoritmi
}
14.Pentru n (n100) numere ntregi citite de la tastatur s se determine:
a. Suma valorilor pare
b. Ultima cifr a produsului valorilor impare
c. Media aritmetica a numerelor citite
12. Citirea pe rand a n numere si prelucrarea perechilor de numere
citite consecutiv (primul cu al doilea, al doilea cu al treilea, al treilea cu al
patrulea, etc.)

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.