You are on page 1of 6

6. Algoritmi elementari 6.1.

Probleme care opereaz asupra cifrelor unui numr


Calculati suma cifrelor numarului nN. Calculati produsul cifrelor numarului nN. Numarati cifrele numarului natural n. Determinati "oglinditul" numarului nN. ex. x =123 inv=321 #include<iostream.h> int main(){ unsigned int n, s=0; cin>>n; while(n!=0){ s=s+n%10; n=n/10;} cout<<"suma= "<<s; return 0;} #include<iostream.h> int main(){ unsigned int n, p=1; cin>>n; cin>>n; while(n!=0){k++; while(n!=0){ n=n/10;} p=p*(n%10); cout<<"nr_cifre= "<<k; n=n/10;} return 0;} cout<<"produs= "<<p; return 0;} cout<<"oglindit= "<<inv; return 0;} return 0;} if (n==inv) cout<<"palindrom"; n=n/10;} cn=cn/10;} inv=inv*10+n%10; inv=inv*10+cn%10; while(n!=0){ while(cn!=0){ cin>>n; cin>>n; cn=n #include<iostream.h> int main(){unsigned int n, k=0; #include<iostream.h> int main(){ unsigned int n, inv=0; verificati daca n e palindrom ex. x =121 inv=121 #include<iostream.h> int main(){ unsigned int n,cn, inv=0;

6.2. Divizibilitate. Numere prime. Algoritmul lui Euclid


Suma divizorilor numarului n #include<iostream.h> unsigned int main(){ int i,n,s=0; cin>>n; for(i=1; i<=n; i++) if (n%i==0) s=s+i; cout<<s; return 0;} Calculati cmmdc(a,b). a,b naturale #include<iostream.h> int main(){ unsigned int a,b; cin>>a>>b; while(a!=b) a=a-b; if(a>b) p=p*i; cout<<k cout<<p; return 0;} return 0;} Calculati cmmmc(a,b). a,b naturale #include<iostream.h> int main(){ unsigned int a,b,p; cin>>a>>b; while(a!=b) a=a-b; p=a*b; if(a>b) Verificati daca n este prim. return 0;} if(s==n) cout<<"perfect"; Produsul divizorilor numarului n #include<iostream.h> int main(){ unsigned int i,n,p=1; cin>>n; for(i=1; i<=n; i++) if (n%i==0) Numarul divizorilor numarului n #include<iostream.h> int main(){ unsigned int i,n,k=0; cin>>n; for(i=1; i<=n; i++) if (n%i==0) k++; s=s+i; Verificati daca n eperfect(6=1+2+3) #include<iostream.h> int main(){ unsigned int i,n,s=0; cin>>n; for(i=1; i<=n/2; i++) if (n%i==0)

#include<iostream.h> int main(){unsigned int i,n,prim=1; cin>>n; if (n<2) prim=0;

for(i=2; i<=n/2 && prim =1; i++) if (n%i==0) prim=0; if (prim==1) cout<<n<<este prim; else cout<<n<<nu este prim; return 0;}

else b=b-a; cout<<"cmmdc= "<<a; return 0;}

else b=b-a; cout<<"cmmmc= "<<p/a; return 0;}

6.3. irul lui Fibonacci. Calculul unor sume cu termenul general dat
Fie sirul Fibonacci 1, 1, 2, 3, 5, 8, 13, 21, 34, .. Se observa ca primii doi termeni sunt egali cu 1, iar fiecare termen urmator este egal cu suma celor doi termeni care il preced (f1=1;f2=1; f3=f1+f2, f4=f2+f3..fn=fn-2+fn-1).

Fie n un numar citit de la tastatura. Sa se scrie un program care sa afiseze cel de-al n-lea termen al sirului Fibonacci.
#include<iostream.h>

Afisati primii n termeni din sirul Fibonacci

#include<iostream.h>

void main(){ int n,i,f1=1,f2=1,f3; cin>>n; for(i=3;i<=n;i++){ f3=f1+f2; f1=f2; f2=f3;} cout<<termenul n= f3; }

void main(){ int n,i,f1=1,f2=1,f3; cin>>n; cout<<f1<< f2<< ; for(i=3;i<=n;i++){ f3=f1+f2; cout<< f3<< ; f1=f2; f2=f3;} }

Calculati S=1+2+...+n
void main(){ int n,i,s=0 cin>>n; for(i=1;i<=n;i++) s=s+i; cout<< suma= <<s; }

Calculati n!=1*2*...*n
void main(){ int n,i,p=1 cin>>n; for(i=1;i<=n;i++) p=p*i; cout<< n!= <<p; }

6.4. Determinare minim/maxim


determinati maximul dintre trei numere intregi
#include<iostream.h> int main(){ int a,b,c,max; cin>>a>>b>>c; max=a; if(b>max) max=b; if(c>max) max=c; cout<<"max="<<max; return 0; }

determinati cifra maxima din numarul n


#include<iostream.h> int main(){ unsigned int n,max=0; cin>>n; while(n!=0){ if(n%10>max)max=n%10; n=n/10;} cout<<"ciframaxima= "<<max; return 0;}

determinati primul si ultimul divizor propriu al numarului n


#include<iostream.h> unsigned int n,i,prim,ultim; void main () {cout<<"n=";cin>>n; prim=0; for (i=2;i<=n/2;i++) if(n%i==0){ if(prim==0) prim=i; ultim=i;} cout<<prim<<" "<<ultim;}

6.5. Metode de ordonare (metoda bulelor, inseriei, seleciei, numrrii)


#include<iostream.h> int a[20],aux,gasit; unsigned int n,i; void main () {cout<<"n=";cin>>n; for (i=0;i<n;i++){ do{gasit=1; for(i=0;i<n-1;i++) if (a[i]>a[i+1]){aux=a[i]; gasit=0;} }while(!gasit); cout<<"sirul sortat este"<<endl; for (i=0;i<n;i++) cout<<a[i]<<" ";} a[i]=a[i+1]; a[i+1]=aux; cout<<"a["<<i+1<<"]="; cin>>a[i];}

6.6. Interclasare
Se citesc m numere sortate crescator (descrescator). Se citesc n numere sortate crescator (descrescator). Sa se afiseze cele m+n numere sortate crescator (descrescator). Ex m=4 a ={3, 5, 6, 12} n=3 b ={1, 4, 8} c ={1, 3,4, 5, 6, 8, 12}

include<iostream.h> void main() {int a[50],b[50],c[100]j,n,m,i,k; cout<<m=;cin>>m ; for (i=0;i<m;i++)cin>>a[i]; cout<<n=;cin>>n ; for (i=0;i<n;i++)cin>>b[i]; i=j=k=0 ; while(i<m && j<n) if(a[i]<b[j]) c[k++]=a[i++] ;

else

c[k++]=b[j++] ;

if(i<m) for (j=i;j<m;j++)c[k++]=a[j]; else for (i=j;i<n;i++)c[k++]=b[i]; for (i=0;i<k;i++) cout<<c[i]<< '' '';

6.7. Metode de cutare (secvenial, binar)


Fie un vector cu n elemente numere intregi. n<100. Sa se caute primul element par din vector #include <iostream.h> int main(){ int i,n,a[100],ok=0; cout<<"n=";cin>>n; for(i=0;i<n;i++){cout<<"a["<<i<<"]="; cin>>a[i];} for(i=0;i<n && ok==0;i++) if(a[i]%2==0) ok++; if (ok==0) cout<<"un exista nr pare in vector"; else cout<< a[i-1]; return 0;}

CAUTARE BINARA Se citesc n numere sortate crescator (descrescator). Se citeste un numar intreg nr. Sa se decida daca nr se gaseste in sirul celor n numere Ex. Daca n=5 a={12, 3, 6, 7, 8}

Daca nr =11 va afisa negasit. Daca nr=7 va afisa gasit pe pozitia 4. include<iostream.h> void main() {int a[50],n,i,li,ls,k,nr,gasit ; cout<<nr=;cin>>nr ; cout<<n=;cin>>n ; for (i=0;i<n;i++)cin>>a[i];

li=0 ;ls=n-1 ;gasit=0 ; do{ k=(li+ls)/2 ; if(a[k]= =nr){cout<< gasit pe pozitia <<k+1 ; gasit=1 ;} else if(a[k]>nr)li=k+1 ; else ls=k-1 ;

}while(li<=ls && !gasit) ; if(li>ls) cout<< negasit;}

6.8. Analiza complexitii unui algoritm (considernd criteriile de eficien durata de executare i spaiu de memorie utilizat)
- Complexitatea tine cont de numarul de date de intrare - se alege o operatie de baza si se determina de cate ori se executa (se presupune ca restul operatiilor se executa de un numar de ori proportional cu nr.executarii operatiei de baza) - exista algoritmi cu complexitate polinomiala O(nk), exponentiala O(an), logaritmica O(log(n)) - cautarea binara. ex. - pentru a calcula valoarea maxima a unui sir de n numere reale se efectueaza n-1 comparatii are complexitatea O(n) -algoritm liniar - pentru a determina daca n numere reale sunt distincte se efectueaza (n-1)+(n-2)+...+1 =n(n-1)/2 comparatii are complexitatea O(n2)

!!!!!!!!!!

este o metoda eficienta din punct de vedere:

- a memoriei utilizate [algoritmul foloseste un numar minim de variabile simple (nestructurate)], -a timpului de executare [se face o singura parcurgere a fisierului (parcurgere obligatorie)- algoritm liniar ].

You might also like