Sunteți pe pagina 1din 6

Algoritmi fundamentali Este vorba despre algoritmi de rezolvare a unor probleme des ntlnite n practic, care fie fac

obiectul unor enunuri, fie sunt utilizai ca etape, pai, n elaborarea unor rspunsuri. Aceti algoritmi au fost concepui spre a veni n ajutorul programatorilor, care i folosesc ori de cte ori este necesar n probleme, fr a mai fi nevoie s-i elaboreze de fiecare dat. Acetia se refer la separarea cifrelor unui numr (folosit de fiecare dat cnd n rezolvarea unei probleme este necesar accesul la cifrele unui numr), determinarea divizorilor proprii ai unui numr natural dat, testarea dac un numr natural mai mare ca 1 este prim, determinarea celui mai mare divizor comun a dou numere naturale date, descompunerea unui numr natural mai mare ca 1 n factori primi, determinarea maximului/minimului unui ir de numere citite, pe rnd, de la dispozitivul de intrare. n continuare, voi prezenta fiecare algoritm fundamental astfel: prezentarea algoritmului, descrierea lui n limbaj pseudocod i n limbaj C++ i rezolvarea cte unei aplicaii n care intervine.

1. Separarea cifrelor unui numr


Se va folosi rezultatul din matematic conform cruia restul mpririi la 10 al unui numr ntreg pozitiv l reprezint ultima cifr a numrului (cea mai puin semnificativ), iar ctul mpririi la 10, numrul fr ultima cifr. Repetnd aceast operaie ct timp numrul mai are cifre de separat, obinem la fiecare pas o cifr a numrului, care poate fi prelucrat, de fiecare dat ctul obinut devenind demprit. n algoritm, marcarea ncheierii separrii cifrelor se face cnd numrul dat devine 0, deci nu mai sunt cifre de separat. Exemplu: n=2415 ct rest 2415:10=241 5 Am obinut cifrele numrului n ordine invers: 5, 1, 4, 2 241 :10=24 1 24 :10=2 4 2 :10=0 2 Limbaj pseudocod ct_timp n 0 execut scrie cifra este ,n%10 {sau orice alta prelucrare} n=[n/10] Limbaj C++ while(n!=0) {cout<<cifra este <<n%10; n=n/10; } }

Exemple 1. Se citete de la tastatur un numr ntreg a. S se afieze suma cifrelor numrului. Limbaj pseudocod Limbaj C++ intreg a,s #include <iostream.h> citeste a void main() s=0 {int a,s=0; cout<<a=;cin>>a; ct_timp a 0 execut while(a!=0) s=s+a%10 {s=s+a%10; a=[a/10] a=a/10; } scrie s cout<<s=<<s<<endl; } 2. Se citete de la tastatur un numr ntreg a. S se precizeze cte cifre are numrul citit. Limbaj pseudocod Limbaj C++ intreg a,k citeste a k=0 ct_timp a 0 execut k=k+1 (numr cifrele) a=[a/10] scrie k #include <iostream.h> void main() {int a,k=0; cout<<a=;cin>>a; while(a!=0) {k++; a=a/10; } cout<<numrul are <<k<< cifre <<endl; }

3. Se citete de la tastatur un numr ntreg a. S se afieze oglinditul numrului. Ex. a=3147; oglinditul este 7413. Limbaj pseudocod Limbaj C++ intreg a,ogl #include <iostream.h> citeste a void main() ogl=0 {int a; long ogl=0; ct_timp a 0 execut cout<<a=;cin>>a; ogl=ogl*10+a%10 while(a!=0) a=[a/10] { ogl=ogl*10+a%10; a=a/10; scrie ogl } cout<<oglinditul numrului dat este <<ogl; }

2. Determinarea divizorilor proprii ai unui numr natural dat


De exemplu, dac n=100, divizorii proprii sunt: 2, 4, 5, 10, 20, 25, 50; dac n=45, divizorii proprii sunt: 3, 5, 9, 15; dac n=32, divizorii proprii sunt: 2, 4, 8, 16. Putem continua cu exemplele, dar i din acestea se poate observa c: - cel mai mic divizor propriu posibil este 2 - cel mai mare divizor propriu posibil este jumtatea numrului [n/2] Este suficient s testm care din valorile cuprinse ntre 2 i [n/2] mpart exact numrul n dat i astfel identificm, pe rnd, divizorii proprii ai numrului, care vor putea fi prelucrai conform cerinelor enunului. Limbaj pseudocod Limbaj C++ pentru i2, [n/2] execut dac n%i=0 atunci scrie i (sau orice alt prelucrare cerut) for(i=2;i<=n/2;i++) if(n%i==0) cout<<i; (am ales s fac operaia de afiare a divizorilor, dar se va face operaia necesar conform algoritmului din enunul concret)

Exemplu Se citete de la tastatur un numr natural x. S se verifice dac x este numr perfect. Un numr este perfect dac este egal cu suma divizorilor si, mai mici dect el. Ex. 6=1+2+3; 28=1+2+4+7+14 Limbaj pseudocod ntreg n,i,s citeste n s=1 pentru i2, [n/2] execut dac n%i=0 atunci s=s+i Limbaj C++ #include <iostream.h> void main() {int n,i,s=1; cout<<n=;cin>>n; for(i=2;i<=n/2;i++) if(n%i==0) s=s+i; if(s==n) cout<<numarul dat este perfect; else cout<<numarul dat nu este perfect; }

dac s=n atunci scrie numr perfect altfel scrie numrul nu este perfect

3. Testul de numr prim


Matematica ne spune c un numr este prim dac are doar doi divizori, pe 1 i numrul nsui, deci cnd nu are divizori proprii. Sunt mai multe modaliti de a verifica dac un numr dat este prim sau nu. Noi o vom folosi pe cea conform creia dac numrul nu are divizori proprii atunci este prim, n caz contrar, dac are cel puin un divizor propriu, atunci numrul nu este prim.

Limbaj pseudocod ntreg n,i logic prim citeste n primtrue pentru i2, [ n] execut dac n%i=0 atunci primfalse dac prim=true atunci scrie nr prim altfel scrie nr nu este prim

Limbaj C++ #include<math.h> #include <iostream.h> void main() {int n,i,prim; cout<<n=;cin>>n; prim=1; for(i=2;i<=sqrt(n);i++) if(n%i==0) prim=0; if(prim==1) cout<<numarul dat este prim; else cout<<numarul dat nu este prim; }

Exemplu Se citesc, pe rnd, de la tastatur n numere naturale. S se afieze media aritmetic a valorilor prime citite. Limbaj pseudocod Limbaj C++ ntreg n,i,j,s,k,x logic prim citeste n s=0 k=0 pentru i1,n execut citete x primtrue pentru j2, [ x ] execut dac x%j=0 atunci primfalse dac prim=true atunci s=s+x k=k+1 dac k0 atunci scrie media aritmetic ,s/k altfel scrie irul dat nu conine numere prime #include <iostream.h> void main() {int n,i,j,prim,s=0,k=0,x; cout<<n=;cin>>n; for(i=1;i<=n;i++) {cout<<dati un numar;cin>>x; prim=1; for(j=2;j<=sqrt(n);j++) if(n%j==0) prim=0; if(prim==1) {s=s+x; k=k+1;} } if(k!=0) cout<<media aritmetica este <<(float)s/k; else cout<<sirul dat nu contine numere prime; }

4. Determinarea celui mai mare divizor comun a dou numere naturale date Varianta 1 (prin mpriri)
S presupunem c avem dou numere naturale a i b, pentru care trebuie s aflm cel mai mare divizor comun(cmmdc). Dac numrul a se mparte exact la numrul b, atunci cmmdc(a,b)=b. Dac cele dou numere nu se mpart exact unul la cellalt, atunci se procedeaz astfel: se mparte n mod repetat a la b, pn cnd restul mpriri devine 0. La fiecare pas se reine restul, mpritorul devine deimpartit, iar restul mpritor. Cmmdc(a,b) este ultimul rest nenul obinut. i aici avem dou modaliti de determinare, dup cum folosim structura repetitiv ct_timp ... execut sau repet ... ct_timp. ct_timp ... execut Limbaj pseudocod Limbaj C++ ra%b ct_timp r0 execut ab br ra%b scrie b r=a%b while(r!=0) {a=b; b=r; r=a%b; } cout<<cmmdc=<<b;

repet ... ct_timp Limbaj pseudocod repeta ra%b ab br cat_timp r0 scrie a

Limbaj C++ do {r=a%b; a=b; b=r; }while(r!=0); cout<<cmmdc=<<a;

Varianta 2 (prin scderi)


Algoritmul este urmtorul: ct timp cele dou numere a i b sunt diferite ntre ele, se scade din numrul mai mare numrul mai mic. n momentul n care cele dou numere devin egale, cmmdc se afl n oricare din cele dou numere a sau b. Limbaj pseudocod ct_timp ab execut dac a>b atunci aa-b altfel bb-a scrie a Limbaj C++ while(a!=b) if(a>b) a=a-b; else b=b-a; cout<< cmmdc= < < a;

Exemple 1. Se dau dou numere naturale a i b. S se verifice dac cele dou numere sunt prime ntre ele. Dou numere sunt prime ntre ele dac cmmdc al lor este 1. Limbaj pseudocod ntreg a,b citete a,b ct_timp ab execut dac a>b atunci aa-b altfel bb-a dac a=1 atunci scrie cele dou nr sunt prime ntre ele altfel scrie cele dou nr nu sunt prime ntre ele Limbaj C++ #include <iostream.h> void main() {int a,b; cin>>a>>b; while(a!=b) if(a>b) a=a-b; else b=b-a; if(a==1) cout<<cele doua nr sunt prime intre ele; else cout<<cele doua nr nu sunt prime intre ele; }

2. Se dau dou numere naturale a i b. S se determine cmmmc (cel mai mic multiplu comun) al celor dou numere.

cmmmc ( a, b) =
Limbaj pseudocod

a *b cmmdc ( a, b)
Limbaj C++ #include <iostream.h> void main() {int a,b,x; cin>>a>>b; x=a*b; while(a!=b) if(a>b) a=a-b; else b=b-a; cout<<cmmmc=<<x/a; }

intreg a,b,x citeste a,b xa*b ct_timp ab execut dac a>b atunci aa-b altfel bb-a scrie cmmmc= ,[x/a]

5. Descompunerea n factori primi a unui numr natural dat, mai mare ca 1


Exemple 120 2 60 2 30 2 15 3 5 5 1 45 3 15 3 5 5 1

Algoritm: se pornete de la primul factor prim posibil, 2; ct timp numrul dat este diferit de 1, se execut operaiile: ct timp numrul se mparte exact la un factor prim se execut mprirea, se prelucreaz factorul i ctul devine demprit se trece apoi la urmtorul factor prim Limbaj pseudocod Limbaj C++ f2 ct_timp n1 execut ct_timp n%f=0 execut scrie f (sau orice alta prelucrare ceruta) n=[n/f] ff+1 #include <iostream.h> void main() {int n,f; cin>>n; f=2; while(n!=1) {while(n%f==0) {cout<<f; n=n/f;} f=f+1; } }

Exemplu Se citete de la tastatur un numr natural mai mare ca 1. S se afieze descompunerea numrului n factori primi sub forma f la puterea p, unde f este factorul prim i p puterea la care apare n descompunere. Ex. descompunerea numrului 120 va fi afiat astfel: 2 la puterea 3 3 la puterea 1 5 la puterea 1 Limbaj pseudocod Limbaj C++ ntreg n,f,p citete n f2 ct_timp n1 execut p0 ct_timp n%f=0 execut p=p+1 n=[n/f] dac p0 atunci scrie f, la puterea ,p ff+1 #include <iostream.h> void main() {int n,f=2,p=1; cin>>n; while(n!=1) {p=0; while(n%f==0) {p=p+1; n=n/f;} if(p!=0) cout<<f<< la puterea <<p<<endl; f=f+1; } }

6. Determinarea minimului/maximului unui ir de numere citite pe rnd


Determinarea maximului

Se presupune c primul numr citit este maximul.Se citesc apoi, pe rnd, numerele i la fiecare pas se compar numrul citit cu maximul existent. Dac numrul citi este mai mare dect maximul, se nlocuiete maximul. Limbaj pseudocod intreg n,i,x,max citeste n,x maxx pentru i2,n executa citeste x daca x>max atunci maxx scrie max Limbaj C++ #include <iostream.h> void main() {int n,i,x,max; cout<<cate numere se dau?;cin>>n; cout<<dati un numar;cin>>x; max=x; for(i=2;i<=n;i++) {cout<<dati un numar;cin>>x; if(x>max) max=x;} cout<<maximul numerelor citite este=<<max<<endl; }

Determinarea minimului Se presupune c primul numr citit este minimul.Se citesc apoi, pe rnd, numerele i la fiecare pas se compar numrul citit cu minimul existent. Dac numrul citi este mai mic dect minimul, se nlocuiete minimul. Limbaj pseudocod Limbaj C++ intreg n,i,x,min citeste n,x minx pentru i2,n executa citeste x daca x<min atunci minx scrie min #include <iostream.h> void main() {int n,i,x,min; cout<<cate numere se dau?;cin>>n; cout<<dati un numar;cin>>x; min=x; for(i=2;i<=n;i++) {cout<<dati un numar;cin>>x; if(x<min min=x;} cout<<minimul numerelor citite este=<<min<<endl; }

Determinarea n acelai timp a minimului i maximului Se presupune c primul numr citit este minimul i n acelai timp maximul. .Se citesc apoi, pe rnd, numerele i la fiecare pas se compar numrul citit cu minimul i maximul existente. Dac numrul citi este mai mic dect minimul, se nlocuiete minimul; dac numrul citi este mai mare dect maximul, se nlocuiete maximul. Limbaj pseudocod Limbaj C++ intreg n,i,x,max,min citeste n,x maxx pentru i2,n executa citeste x daca x>max atunci maxx daca x<min atunci minx scrie max,min #include <iostream.h> void main() {int n,i,x,max,min; cout<<cate numere se dau?;cin>>n; cout<<dati un numar;cin>>x; max=x; min=x; for(i=2;i<=n;i++) {cout<<dati un numar;cin>>x; if(x>max) max=x; if(x<min) min=x;} cout<<maximul numerelor citite este=<<max<<endl; cout<<minimul numerelor citite este=<<min<<endl; }