You are on page 1of 9

Algoritmi elementari

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 sumei cifrelor
s=0;
while(n>0)
{
c=n%10;
s=s+c;
n=n/10;
}
b. 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;
}
d. aflarea cifrei maxime sau minime din numar
Iniializm cmin=9, cmax=0 iar la fiecare pas actualizm cu:
if(cmin>n%10)cmin=n%10;
if(cmax<nn%10)cmax=n%10;
2. S se determine inversul 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
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;
}
Se citeste un numar natural n. Sa se determine daca el are cifrele ordonate crescator sau
descrescator sau cifrele lui nu sunt ordonate.

#include<iostream>
using namespace std;
int main()
{
int n,c,d;
c=d=1;
cin>>n;
while(n>9)
{
if(n%10>=n/10%10) d=0;
if(n%10<=n/10%10) c=0;
n=n/10;
}
if(c==1) cout<<"crescator";
else if (d==1) cout<<"descrescator";
else cout<<"nici";
return 0;
}
Se citesc numere naturale pn cnd se introduce numrul 0. Afisati suma obtinut prin
adunarea primei si a ultimei cifre din fiecare numar citit. Numerele cu mai putin de 2 cifre nu
se iau in considerare. Exemplu: dac se introduc numerele 3455 66 7 8 23 11221 0 atunci se
va afisa 27 (3+5+6+6+2+3+1+1).

#include <iostream>
using namespace std;
int main()
{
int n,s=0;
cin>>n;
while(n!=0)
{
if(n>9) //daca numarul are cel putin doua cifre
{
s=s+n%10;//insumez ultima cifra
while(n>9)
n=n/10;//tai toate cifrele inafara de prima
s=s+n;//insumez prima cifra
}
cin>>n;
}
cout<<s;
return 0;
}
Se citeste un numar natural n cu cel mult 9 cifre. Sa se calculeze numarul obtinut din cifrele
lui pare aflate pe pozitii impare, numararea pozitiilor cifrelor incepand cu cifra cea mai
semnificativa.
Ex: daca n=2346561 rezulta 24

#include<iostream>
using namespace std;

int main()
{ long n,r=0;
cin>>n;
while(n)
{ r=r*10+n%10;
n=n/10;
}
while(r)
{ if(r%2==0) n=n*10+r%10;
r=r/100;
}
cout<<n;
}
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
4. 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
5. 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++)//d<=n/2
if (n % d == 0) {prim = 0; break;}
if (prim == 1) .... //operatiile de efectuat cand n este prim
}
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
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
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)
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 (d * d <= n)
{
m = 0;
while ( n % d == 0)
{ m++; n = n / d;}
if (m>0) ... //operatii care trebuie efectuate cu divizorul prim d la puterea m
d++;
}
if (n>1) prelucreaza ultimul divizor prim n, care apare la puterea 1
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.

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

fin>>n;
f0 = f1 = 1;
while (f0+f1 <= n)
{
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
Prelucreaza f1
Se citesc doua numere naturale a si b (ambele mai mari decat 1). Calculati si afisati cati
termeni din sirul lui Fibonacci se afla in intervalul [a,b].
Exemplu: In intervalul [20,40] sunt 2 termeni (21 si 34)
#include <iostream>
using namespace std;

int main()
{
int a,b,k=0,x,y,z;
cin>>a>>b;
x=y=1;
while(x+y<=b)
{
z=x+y;
if(z>=a) k++;
x=y;
y=z;
}
cout<<k;
return 0;
}
S se afieze primii n termeni din irul lui Fibonacci, unde n este numr natural citit de la
tastatur.
8. Cifra de control a lui n

if (n == 0) cifc = 0;
else
if (n % 9 == 0) cifc = 9;
else cifc = n % 9;
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.

9.. 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;
10. 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
}
Prelucrarea unui sir de n numere
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
Se citeste un numar natural n si apoi n numere naturale. Afisati cate dintre numerele citite au
rasturnatul egal cu primul numar citit. Ex: se citesc n= 7 si numerele 231 78 132 30 132 8
132 se va afisa 3

int main()
{
int i,n,x,y,k=0,r;
cin>>n;
cin>>x;
for(i=1;i<n;i++)
{
cin>>y;
r=0;
while(y>0) {r=r*10+y%10; y=y/10;}
if(r==x) k++;
}
cout<<k;
return 0;
}
11. 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;
}
12. 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)
}
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.
13. Parcurgerea numerelor dintr-un interval [a,b]
#include<iostream>

using namespace std;

int main()
{
int a, b, i, ok, d;
cin>>a>>b;
for(i=a;i<=b;i++)
{
ok=1;
if(i==0 || i==1) ok=0;
else for(d=2;d<=i/2;d++)
if(i%d==0) ok=0;
if(ok) cout<<i<<" ";
}
return 0;
}
Se citesc doua numere naturale a si b. Calculati cate numere palindrom sunt din intervalul
[a,b]. Un numar este palindrom daca are aceeasi valoare atat daca e citit de la stanga la
dreapta cat si de la dreapta la stanga (de exemplu 12321).

#include <iostream>
using namespace std;

int main()
{
int a,b,k=0;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
for(int x=a;x<=b;x++)
{
int y=x;
int r=0;
while(y>0)
{
r=r*10+y%10;
y=y/10;
}
if(x==r)
{
cout<<x<<" ";
k++;
}
}
cout<<"sunt "<<k<<" palindroame in intervalul ["<<a<<","<<b<<"]";
return 0;
}