Sunteți pe pagina 1din 11

Fia de documentare 2.5.

Algoritmi elementari ce folosesc structuri fundamentale


n continuare vom prezenta civa algoritmi utili care prelucreaz numere ntregi i naturale.

1. Divizibilitate Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s verifice dac cele dou numere sunt divizibile (a divizibil cu b sau b divizibil cu a). De exemplu dac se citesc numerele a = 25 i b = 5 atunci algoritmul va afia DA, iar n cazul n care se citesc a = 25 i b = 10 se va afia NU. n pseudocod algoritmul de rezolvare este: a, b ntregi citete a, b dac (a % b = 0 sau b % a = 0) atunci | scrie DA | altfel | scrie NU | Explicarea algoritmului: Se folosete o structur alternativ, n care se verific a este divizibil cu b (dac restul mparirii lui a la b = 0) sau invers.

2. Paritate Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul a este par, afiandu-se un mesaj corespunzator. De exemplu dac se citete pentru a valoarea 88 atunci algoritmul va afia PAR, iar n cazul n care se citete a = 15 se va afia IMPAR. n pseudocod algoritmul de rezolvare este: a ntreg citete a dac (a % 2 = 0) atunci | scrie PAR | altfel | scrie IMPAR |

Explicarea algoritmului: Se foloseste o structur alternativa, n care se verific dac a este divizibil cu 2 (daca restul mpririi lui a la 2 = 0).

3. Divizorii unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze toti divizorii numrului a. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia 1 2 3 4 6 12, iar n cazul n care se citete a = 13 se va afia 1 13. n pseudocod algoritmul de rezolvare este: a,i ntreg citete a pentru i 1, a execut | dac (a % i = 0) atunci | | scrie i | | | Explicarea algoritmului: Se foloseste o structur repetitiv cu numr cunoscut de repetiii, n care se verific dac a este divizibil cu i (dac restul mpririi lui a la i = 0), unde i ia toate valorile de la 1 la a.

4. Divizorii proprii ai unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afieze toti divizorii proprii ai numrului a. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia 2 3 4 6, iar n cazul n care se citete a = 13 se va afia mesajul nu exist divizori proprii. n pseudocod algoritmul de rezolvare este: a, i, sem ntreg sem 0 //folosit pentru a reine dac am gsit divizori citete a pentru i 2, [a/2] execut | dac (a % i = 0) atunci | | scrie i | | sem 1 //marchez faptul ca am gsit divizori | | | daca sem = 0 atunci | scrie nu exist divizori proprii | Explicarea algoritmului: Se cunoate faptul c divizorii proprii ai unui numr se afl n intervalul nchis [2, [a/2] ], unde [a/2] este partea ntreag a lui a/2. Se folosete o structur repetitiv cu numr cunoscut de repetiii, n care se verific dac a este divizibil cu i (dac restul mpririi lui a la i = 0), unde i ia toate valorile de la 2 la [a/2].

5. Primalitatea unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul a este prim. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia numar NEPRIM, iar n cazul n care se citete a = 13 se va afia mesajul numar PRIM. n pseudocod algoritmul de rezolvare este: a, i, prim ntreg citete a dac a <= 1 atunci | scrie numar NEPRIM | altfel | | prim 1 //presupunem ca numrul este prim | | pentru i 2, [a/2] execut | | | dac (a % i = 0) atunci | | | | prim 0 //am gsit divizori deci nr nu e prim | | | | | | | | | dac prim = 1 atunci | | | scrie numar PRIM | | |altfel | | |scrie numar NEPRIM | | | | | | Explicarea algoritmului: Se cunoate faptul c un numr este prim dac NU are divizori proprii. De asemenea se tie c numrul 1 NU este prim, de aceea vom trata separat cazul a=1. Algoritmul folosete o structur repetitiv cu numr cunoscut de repetiii, n care se caut divizori proprii. n caz c se gasesc divizori, numrul nu este prim altfel numrul este prim. Se foloseste o variabil semafor numit prim care iniial are valoarea 1 i se modific n 0 doar dac se gsesc divizori.

6. Descompunerea n factori primi ai unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afieze factorii primi i puterile lor pentru numrul citit. De exemplu dac se citete pentru a valoarea 36 atunci algoritmul va afia 2^2, 3^2. n pseudocod algoritmul de rezolvare este: a, d, p ntreg

citete a d 2 //primul factor prim este 2 ct timp a > 1 execut | p 0 //puterea factorului d este 0 | ct timp (a % d = 0) execut | | p p + 1 | | a a / d | | | dac p 0 atunci | | scrie d, ^, p, , | | | d d + 1 |

36 18 9 3 1

2 2 3 3

Explicarea algoritmului: Algoritmul urmrete pas cu pas procedeul matematic de descompunere n factori primi. Se folosesc dou structuri repetitive cu test iniial, imbricate. Prima structur asigur repetarea instruciunilor ct timp numrul nu a ajuns la 1. A doua structur numr n variabila p (care se iniializeaz cu 0 pentru fiecare nou valoare a lui d) de cte ori se poate face mparirea numrului la divizorul d. n cazul n care s-a putut mpari a la d (deci p este diferit de 0), se afieaz divizorul i puterea lui. Apoi se crete d i se repet instruciunile pentru a se verifica dac acest nou numr este divizor i a afla puterea.

7. Cel mai mare divizor comun intre 2 numere ntregi a i b Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s afieze cmmdc(a,b). De exemplu dac se citete pentru a valoarea 36 i pentru b valoarea 24 atunci algoritmul va afia 12. n pseudocod algoritmul de rezolvare este: a, b, r ntreg citete a, b r a % b //r reine restul mpririi lui a la b ct timp r 0 execut | a b | b r | r a % b | scrie cmmdc este , b

Explicarea algoritmului: Algoritmul folosit este algoritmul lui EUCLID. Exista i algoritmul care afla cmmdc prin scadere nsa nu este eficient (despre eficiena algoritmilor vom vorbi tema urmtoare). Algoritmul lui Euclid folosete o structur repetitiv cu test iniial. Mai nti aflm restul mpririi lui a la b i ct timp acest rest este diferit de 0, vom nlocui pe a cu b i pe b cu restul obinut, dup care recalculm restul mpririi noului a la noul b. Euclid a demonstrat c oricare ar fi numerele a i b iniiale, repetnd operaiile descrise mai sus, gsim restul = 0. n acel moment putem afirma c cmmdc(a,b) este ultimul rest nenul. Deoarece variabila b ia mereu valoarea restului, afiam pe b ca fiind cmmdc.

8. Numere perfecte Se citete un numr ntreg n. S se realizeze un algoritm care s afiseze toate numerele perfecte mai mici sau egale cu n. Spunem c un numr este perfect dac este egal cu suma divizorilor si, far el nsui. De exemplu dac se citete pentru n valoarea 30 atunci algoritmul va afia 6 28, deoarece aceste dou numere sunt singurele pentru care putem scrie: 6 = 1 + 2 + 3 i 28 = 1 + 2 + 4 + 7 + 14. n pseudocod algoritmul de rezolvare este: n, i, d, s ntreg citete n pentru i 1, n execut

| s 0 // verificm fiecare i dac este perfect | pentru d 1, i/2 execut | dac i % d = 0 atunci // dac d este divizor | | s s + d // l adaug la sum | | | dac s = i atunci //dac suma = i atunci i este perfect | | scrie i | | |

Explicarea algoritmului: Algoritmul verific fiecare numr cuprins ntre 1 i n dac este numr perfect. Aceast verificre se face iniializnd suma cu 0 pentru fiecare numr i cutnd divizorii de la 1 la jumatatea numrului. Divizorii se adaug la sum iar la final aceasta este comparat cu numrul testat.

9. Numere prietene Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s verifice dac cele doau numere sunt prietene. Spunem ca dou numere sunt prietene dac suma divizorilor proprii ai unui numr este egal cu celalalt i invers. De exemplu dac se citete pentru a valoarea 284 i pentru b valoarea 220 atunci algoritmul va afia mesajul numere prietene. n pseudocod algoritmul de rezolvare este: a, b, sa, sb ntreg citete a, b sa 0 sb 0 pentru i 2, [a/2] execut | dac (a % i = 0) atunci | | s s + i //suma divizorilor proprii numrului a | | | pentru i 2, [b/2] execut | dac (b % i = 0) atunci | | sb sb + i // suma divizorilor proprii numrului b | | | daca sa = b i sb = a atunci | scrie numere prietene | altfel | scrie NU sunt numere prietene |

Explicarea algoritmului: Algoritmul calculeaz suma divizorilor lui a n sa i suma divizorilor lui b n sb. Apoi verific dac sa = b i sb = a. Dac condiia este adevarat se afieaz numere prietene altfel se afieaz Nu sunt numere prietene.

10. Factorial Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze n! Factorial de n (notat n!) este produsul numerelor de la 1 la n. De exemplu dac se citete pentru a valoarea 4 atunci algoritmul va afia 24, deoarece 4! = 1 * 2 * 3 * 4 = 24. n pseudocod algoritmul de rezolvare este: a, i, p ntreg citete a p 1 pentru i 1, a execut | p p * i //calculm produsul | scrie p

Explicarea algoritmului: Algoritmul calculeaz produsul numerelor de la 1 la a n variabila p. Iniial variabila p = 1 deoarece produsul se iniializeaz cu elementul neutru de la nmultire, adic 1.

11. Sirul lui Fibonacci Se citete un numr ntreg n (2< n <= 20). S se realizeze un algoritm care s afieze al nlea termen din irul lui Fibonacci. De exemplu dac se citete pentru n valoarea 8 atunci algoritmul va afia 21, deoarece al 8-lea termen din irul lui Fibonacci este 21. n pseudocod algoritmul de rezolvare este: n, f1, f2, f3, i ntreg citete n f1 1 f2 2 // iniializarea primilor termeni din ir pentru i 3, n execut | f3 f2 + f1 //calculul termenului curent din ir | f1 f2 | f2 f3 | scrie f3

Explicarea algoritmului: irul lui Fibonacci se formeaz dup urmatoarea formul: 1 Fibo(n) = Fibo (n-1) + Fibo (n-2) dac n > 2 Algoritmul calculeaz fiecare termen i cnd ajunge la al n-lea se oprete i l afieaz. Se folosete o structur repetitiv cu numr cunoscut de repetiii, unde variabila contor i ia valori de la 3 la n, deoarece primii doi termeni sunt deja calculai, iar noi trebuie s calculm termenii ncepand cu al 3-lea. dac n = 1 sau n = 2

12. Numrul invers Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze numrul invers. Numim numr invers (sau oglindit) numrul format cu cifrele citite de la dreapta la stanga. De exemplu dac se citete pentru a valoarea 327 atunci algoritmul va afia numrul invers 723. n pseudocod algoritmul de rezolvare este: a, inv ntreg

citete a inv 0 //initial inv este nul ct timp a 0 execut | inv inv * 10 + a % 10 | a a / 10 | scrie inv Explicarea algoritmului: Algoritmul descompune n cifre numrul a i adaug fiecare cifr la numrul invers.

13. Numrul palindrom Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul citit este sau nu palindrom. Numim palindrom un numr care este egal cu oglinditul su. De exemplu dac se citete pentru a valoarea 323 atunci algoritmul va afia PALINDROM, iar dac va citi 123 va afia NU. n pseudocod algoritmul de rezolvare este: a, inv, aux ntreg citete a aux a //salvez valoarea iniial a lui a n aux inv 0 //iniial inv este nul ct timp aux 0 execut | inv inv * 10 + aux % 10 | aux aux / 10 | Dac inv = a atunci | scrie PALINDROM |altfel | scrie NU |

Explicarea algoritmului: Algoritmul se bazeaz pe problema anterioar, de calcul al numrului invers. Un numr este palindrom dac numrul iniial citit este egal cu inversul sau. De aceea algoritmul descompune n cifre numrul a i formeaz numrul invers, dupa care compar acest numr invers cu numrul iniial citit. Am descompus n cifre o copie a numrului a deoarece n structura repetitiv se modific valoarea numrului introdus, iar noi avem nevoie de valoarea iniiala pentru verificare.

14. Maximul ntr-un ir de numere

Se citete un numr n ntreg i apoi n numere ntregi. S se realizeze un algoritm care s afiseze cel mai mare numr citit. De exemplu dac se citete pentru n valoarea 5 i apoi valorile 12, 220, 23, 89, 146 atunci algoritmul va afia mesajul 220, deoarece 220 este valoarea maxim citit. n pseudocod algoritmul de rezolvare este: n, i, x, max ntreg citete n citete x//citesc primul numr din ir separat de celelalte max x //iniial max = primul numr citit din ir pentru i 2, n execut | //de la 2 pentru c am citit deja un numr din ir | citete x | dac (x > max) atunci | | max x //max = noua valoare a lui x | | | scrie max

Explicarea algoritmului: Algoritmul citete pe rnd n numere de la tastatur i afieaz n final cel mai mare numr dintre ele. Se citete primul numr din ir n afara structurii repetitive iar max se iniializeaz cu acea valoare. Variabila max se poate iniializa cu orice valoare din ir, ns pentru comoditate iniializm cu prima valoare. Apoi, n structura repetitiv, pe masur ce cititm n x alte valori, le comparm cu variabila max. Dac gsim un numr mai mare dect max, atunci nlocuim valoarea lui cu numrul x.

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