Documente Academic
Documente Profesional
Documente Cultură
Algoritmi-Fundamentali 3
Algoritmi-Fundamentali 3
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.
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 a0 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 a0 execut
k=k+1 (numr cifrele)
a=[a/10]
#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;
}
scrie k
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
Limbaj C++
ntreg n,i,s
citeste n
s=1
pentru i2, [n/2] execut
dac n%i=0 atunci s=s+i
#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;
}
Limbaj pseudocod
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;
}
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
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
#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;
Limbaj C++
repeta
ra%b
ab
br
cat_timp r0
scrie a
do
{r=a%b;
a=b;
b=r;
}while(r!=0);
cout<<cmmdc=<<a;
Limbaj C++
ct_timp ab execut
dac ab atunci aa-b
altfel bb-a
while(a!=b)
if(ab) a=a-b;
else b=b-a;
coutcmmdc=a;
scrie 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
Limbaj C++
ntreg a,b
citete a,b
ct_timp ab execut
dac ab atunci aa-b
altfel bb-a
#include <iostream.h>
void main()
{int a,b;
cin>>a>>b;
while(a!=b)
if(ab) 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;
}
dac a=1 atunci scrie cele dou nr sunt prime ntre ele
altfel scrie cele dou nr nu sunt prime ntre 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)
a *b
cmmdc( a, b)
Limbaj pseudocod
Limbaj C++
intreg a,b,x
citeste a,b
xa*b
ct_timp ab execut
dac ab atunci aa-b
altfel bb-a
#include <iostream.h>
void main()
{int a,b,x;
cin>>a>>b;
x=a*b;
while(a!=b)
if(ab) a=a-b;
else b=b-a;
cout<<cmmmc=<<x/a;
}
scrie cmmmc=,[x/a]
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]
#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;
}
}
ff+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]
#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;
}
}