Sunteți pe pagina 1din 8

Algoritmi fundamentali- dedicație: pentru clasa a IX-a B

Prof. Daniela Cameniță

Algoritmi fundamentali care folosesc tipuri simple de date, NU structurate

1. ALGORITM PENTRU PRELUCRAREA CIFRELOR UNUI NUMAR NATURAL


a) cu structura “cat timp”

citeste n
pregatesc prelucrarea( depinde de problema)
cat timp n>0 executa
ucn%10 (adica am extras cifra unitatilor/ultima cifra)
prelucrez uc (depinde de problema)
n[n/10] (scap de ultima cifra, fara instructiunea asta as cicla la infinit)
sfarsit_cattimp

Observatii:

1) cazul n=0 trebuie tratat separat(de exemplu, daca ar trebui sa numaram cate cifre are n. Pentru n=0,
conform algoritmului ar reiesi ca are 0 cifre, ceea ce este fals!!!!!!)
2) prelucrarile pot fi: -calcule de sume (atunci variabila care calculeaza suma, va fi initial 0)
-calcule de produse(atunci variabila care calculeaza produsul va fi initial 1)
-contorizari, adica textul ne zice:” cate cifre are…” sau “numarati cate cife sunt
….” atunci variabila in care se face numararea va fi 0
- pentru media aritmetica avem nevoie si de suma(s) si de contor(k), iar la sfarsit
se testeaza daca, contorul(k) este diferit de 0 si atunci mas/k, iar in C++ va fi
ma=(float)s/k ( convertesc la numar real s, ca sa iasa corect calculul mediei
aritmetice)

3) cand transcrieti in C/C++ instructiunea pseudocod

n=[n/10] devine in C/C++ n=n/10;

Aplicatii importante la algoritmii de cifre

-----determinarea oglinditului

citeste n
ogl0
cat timp n>0 executa
ucn%10
oglogl*10+uc
n[n/10]
sfarsit_cattimp
tipareste ogl

Nu e obligatoriu sa scrieti explicit ucn%10, puteti sa folositi valoarea n%10, direct in calculul oglinditului, adica

oglogl*10+n%10

(Voi scrie asa la urmatoarea problema)

1
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

-----determinarea daca un numar este sau nu palindrom

citeste n
ogl0
auxn (numarul initial trebuie salvat ca se pierde, ajungand la 0)
cat timp n>0 executa
oglogl*10+uc
n[n/10]
sfarsit_cattimp
daca ogl=aux atunci
tipareste” este palindrom”
altfel

tipareste “nu este palindrom”

sfarsit daca

b) cu structura repetă…… până când (structura repetitivă cu număr necunoscut de pași condiționata
posterior/ cu test final
citeste n
pregatesc prelucrarea( depinde de problema)
repetă
ucn%10
prelucrez uc (depinde de problema)
n[n/10]
până când n=0

Observatii:

1) Functioneaza si pentru cazul n=0


2) Nu există exact o transcriere în C/C++ a acestei instrucțiuni pseudocod. Pentru a o scrie in C/C++
folosim instrucțiunea do while, dar SE NEAGĂ CONDIȚIA

Exemplu, pentru a număra câte cifre are un număr n, natural dat.

Pseudocodul ar arata asa: iar in C/C++ secventa este


Citeste n cin>>n;
K0 k=0;
repeta do
kk+1 {k=k+1;
n[n/10] n=n/10;
pana cand n=0
}
2 while (n!=0);
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

Nu a mai fost cazul sa scriu exact cat este ultima cifra

-------Construirea unui numar, de la stanga la dreapta(fara oglindit)

De exemplu: modificarea fiecarei cifre pare, crescand-o cu o unitate(daca n=1234, va rezulta 1335)

citeste n
nr0 (nr este numarul care vreau sa-l construiesc)
P1 (P ordinal unitatilor care este 100
cat timp n<>0
ucn%10
daca uc%2=0 atunci
nrnr+P*(uc+1) (aici au loc modificarile cerute de problema)
PP*10 (creste P, ca va fi pe pozitia zecilor, apoi a sutelor, etc deci trebuie inmultit cu 10)
sfarsitdaca
nn/10
sfarsitcattimp
scrie nr

Probleme fundamentale pentru algoritmul de descompunere in cifre

P1. Se citeste un numar natural.Numarati cate cifre are.

P2. Se citeste un numar natural.Determinati suma/produsul cifrelor sale.

P3. Se citeste un numar natural. Precizati daca are toate cifrele pare

P4. Se citeste un numar natural si o cifra c. Determinati de cate ori apare c in numar

P5.Determinati daca un numar este sau nu palindrom

P6. “Cifra de control”. Se da un numar n citit de la tastatura. Sa se afiseze cifra sa de control.


Cifra de control se calculeaza facand suma cifrelor numarului, dupa care suma cifrelor sumei si asa mai departe
pana cand suma obtinuta este o cifra.

Exemplu: pentru n=49186. Se calculeaza intai 6+8+1+9+4=>28, apoi la 28, pentru ca nu este inca o cifra se
calculeaza 8+2=10, pentru ca nu este inca o cifra calculez 0+1=> 1

3
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

2. ALGORITMI PENTRU GENUL DE PROBLEMA GEN “ SE CITESC PE RAND NUMERE PANA LA INTALNIREA
NUMARULUI X( X DAT). DETERMINATI…..”

Citeste n
Pregatesc prelucrarea (depinde de problema)
Cat timp n<>X
Prelucrez (depinde de problema)
Citeste n (ft important, altfel cicleaza la infinit!!!!!!)
Sfarsit cattimp

Exemplu: se citesc pe rand numere pana la intalnirea numarului 0. Determinati daca s-au citit mai
multe numere pozitive, mai multe negative, sau in mod egal. Dati un mesaj corespunzator.

Citeste n
Kn0 (Kn este contorul care va numara cate numere sunt negative)
Kp0 (Kp este contorul care va numara cate numere sunt positive)
Cat timp n<>0
daca n>0 atunci
KpKp+1
altfel
KnKn+1
Sfrasit daca
Citeste n
Sfarsit cattimp
daca Kp<Kn atunci
scrie “S-au citit mai multe negative”
altfel
daca Kp>Kn atunci
scrie “S-au citit mai multe pozitive”
altfel
scrie “Numar egal de numere negative si pozitive”
sfarsit daca
sfarsitdaca

4
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

3. ALGORITMI DE DETERMINARE A CMMDC(cel mai mare divizor comun) A DOUA NUMERE DATE
EX: a=24, b=30 => cmmdc=6
a) PRIN SCADERI REPETATE
citeste a, b
cat timp a<>b executa
daca a>b atunci
aa-b
altfel
bb-a
sfarsit daca
sfarsit cattimp
cmmdca
scrie cmmdc

b)ALGORITMUL LUI EUCLID O alta varianta:


(prin impartiri repetate)
citeste a, b Citeste a,b
ra%b repeta
ra%b
cat timp r<>0 executa
ab
ab br
br pana cand r=0
ra%b cmmdca
sfarsitcattimp
cmmdcb
scrie cmmdc

Observatie:Daca unul dintre numere este 0, atunci cmmdc=numarul nenul(se trateaza ca si caz particular, in
algorimii de mai sus nu am prevazut cazul)

Probleme fundamentale pentru algoritmul de determinare a cmmdc

P1. Determinarea cmmmc-lui(cel mai mic multiplu comun)

cmmmca*b/cmmdc (Atentie! ca trebuie salvat produsul numerelor)

P2. Determinarea daca doua numere sunt prime intre ele(adica cmmdc=1)

P3: Aducerea unei fractii data prin numarator si numitor la o fractie ireductibila(fractia se simplifica cu
cmmdc. Atentie! Trebuie salvate valorile initiale ale numaratorului si numitorului)

P4: Determinarea cmmdc-ului a 3 numere

P5:Determinarea cmmdc-ului a n numere, care se citesc pe rand.


5
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

4. ALGORITMUL DE DESCOMPUNERE IN FACTORI PRIMI

Ex: n=140 n=22*51*71

Cit. n
f2 //f reprezinta factorul prim
cat timp n>1 executa
p0 //p reprezinta puterea la care va apare factorul f in descompunere
cat timp n%f=0 executa
nn/f
pp+1
sfarsit cattimp
daca p>0 atunci
scrie f, “la puterea “, p
sfarsit daca
daca f=2 atunci f3
altfel
ff+2
sfarsit daca //se modifica factorul, si deoarece doar 2 este factor par, de la 2 il transform in 3,
//altfel modific factorul din 2 in 2
sfarsit cat timp

Aplicatie:
-Numarul de divizori ai unui numar natural este
(p1+1)*(p2+1)*…*(pk+1), unde n=f1p1*f2p2*…*fkpk

Ex n=12, are 6 divizori:1, 2, 3, 4,6, 12


n=22*31 =>(2+1)(1+1)=6

Probleme care se pot rezolva folosind descompunerea in factori primi

P1. Precizati unde se face modificarea pentru a afisa descompunerea in factori primi(ca la matematica)
P2.Aflati cel mai mare exponent care apare in descompunerea in factori primi
P3. Folosind descompunerea in factori primi determinati daca un numar este prim sau nu-

6
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

5. ALGOTITMI PENTRU DIVIZORI

Un numar n are divizori proprii si divizori improprii (1 si el insusi)


Ex: n=18 are ca divizori proprii: 2, 3, 6, 9
Si divizori improprii: 1 si 18

Observăm că: cel mai mic divizor propriu poate fi 2 și cel mai mare jumatatea numarului

Citeste n
pentru d2, [n/2] executa
Daca n %d=0 atunci
prelucrez d (depinde de problema, poate se scrie, sau se aduna, sau se contorizeaza, etc)
sfarsit daca
sfarsit pentru

Obs. Am avut in vedere doar divizorii proprii

Alte imbunatatiri ale algoritmului pentru probleme de finete vom vedea la clasa!!!

Aplicatie: Determinati daca un numar este perfect (adica este egal cu suma divizorilor sai, fara el insusi)
Exemple de numere perfecte: 6 (6=1+2+3). 28(28=1+2+4+7+14)

6. ALGORITM DE VERIFICARE DACA UN NUMAR ESTE SAU NU ESTE NUMAR PRIM

NUMAR PRIM=numar care are ca divizori doar pe 1 si el insusi


Ex: 7, 101, 31, 13

Obs: Numarul 1 nu este prim!!!!!!

Cit n
sw1 (adica presupun ca este prim)
pentru d2, [n/2] executa
daca n %d=0 atunci
sw0 (daca am gasit divizor, se schimba starea variabilei sw in 0)
sfarsit daca
sfarsit pentru
daca sw=1 si n>1 atunci
scrie “Numar prim”
altfel
scrie “NU este prim”
sfarsit daca

O imbunatatire a algoritmului din punct de vedere a timpului de executie ar fi sa luam intervalul de presupusi
divizori doar [2, sqrt(n)] ( se modifica la structura
pentru d2, [sqrt(n)] executa
daca n %d=0 atunci
sw0 (daca am gasit divizor, se schimba starea variabilei sw in 0)
sfarsit daca
7
Algoritmi fundamentali- dedicație: pentru clasa a IX-a B
Prof. Daniela Cameniță

sfarsit pentru
daca sw=1 si n>1 atunci
scrie “Numar prim”
altfel
scrie “NU este prim”
sfarsit daca

Sau daca nu vreau sa folosesc functia sqrt in C++ pot scrie


for (d=2; d*d<=n; d++)
…….

Alte imbunatatiri ale algoritmului pentru probleme de finete vom vedea la clasa!!!

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