Sunteți pe pagina 1din 5

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 n0 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 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

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 a0 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

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

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

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

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

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

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;

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

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]

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]

#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

S-ar putea să vă placă și