RSS

Category Archives: C2_1. Algoritmica

Definitie. Structuri logice. Exemple de algoritmi.(in general materia clasei a 9-a)

L14. Conversia unui numar din baza 10 in baza B

Un numar NB scris in baza B are “cifre” cu valori intre 0 si B-1.

Pentru a obtine reprezentarea numarului N10 in baza B, trebuie sa realizam un sir de impartiri repetate la B.

Fie N10=2490 si B=8

2490 impartit la 8 produce catul 311 si restul 2.

311 impartit la 8 produce catul 38 si restul 7

38 impartit la 8 produce catul 4 si restul 6

4 impartit la 8 produce catul 0 si restul 4

Luam resturile in ordine inversa si obtinem NB=4672.

Algoritmul de mai jos urmareste exact acest tip de calcul. Se observa ca pentru constructia lui NB trebuie sa lipim fiecare rest in fata numarului NB.

citeste N10;

NB=0;

p10=1;

cat timp(N10!=0)

{

NB=NB+P10*(N10%B);

P10=P10*10;

N=N/B;

}

scrie NB.

 
6 Comments

Posted by on 02/10/2012 in C2_1. Algoritmica

 

Tags: ,

L13. Conversia unui numar din baza B in baza 10

Un numar NB scris in baza B are “cifre” cu valori intre 0 si B-1. Problema noastra este sa determinam ce numar N10 ii corespunde lui NB pentru baza 10.

Pentru aceasta sa observam urmatorul exemplu. Un numar in baza 10, N10=2490 poate fi scris si in forma canonica, adica N10=2*10^3+4*10^2+9*10^1+0*10^0.

Fie NB=4672 scris in baza B=8. Pentru a converti NB in baza 10 trebuie sa il scriem in forma canonica.

N10=4*8^3+6*8^2+7*8^1+2*8^0. Dupa calcule se obtine valoarea N10=2490.

Practic trebuie sa calculam o suma de produse a cifrelor din NB cu puteri ale bazei. Vom folosi algoritmul de prelucrare a cifrelor unui numar (NB).

citeste NB, B;

N10=0;

PB=1;

executa{

     N10=N10+(NB%10)*PB;

     PB=PB*B;

     NB=NB/10;

     }cat timp (NB!=0);

scrie N10;

 
10 Comments

Posted by on 02/10/2012 in C2_1. Algoritmica

 

Tags: ,

L12. Sirul lui Fibonacci

Sirul lui Fibonacci este  1, 1, 2, 3, 5, 8, 13, 21, 34, …. si are legatura cu celebrul numar de aur.

Se observa ca sirul incepe cu valorile 1 si 1 , dupa care, fiecare noua valoare se obtine prin adunarea ultimelor doua valori:

  • F(1)=1
  • F(2)=1
  • F(n)=F(n-1)+F(n-2)

Pentru noi problema este de a determina al N-lea termen din sir.

Daca N=1 sau N=2, raspunsul este simplu, 1. In restul cazurilor trebuie ca avand mereu ultimile valori A si B, sa calculam noua valoare C=A+B (mereu trebuie memorata noua pereche formata – ultimile doua valori determinate)

citeste N;

A=1;B=1;

daca (N<=2) atunci scrie 1;

        altfel {pentru i=3,N executa

                      {//calculam noua valoare

                       C=A+B;

                      //pregatim noua pereche

                      A=B;B=C}

                scrie B;}

 
7 Comments

Posted by on 02/10/2012 in C2_1. Algoritmica

 

Tags:

L11. Cmmdc. Cmmmc

C.m.m.d.c. este acronimul (prima litera de la fiecare cuvant) de la “cel mai mare divizor comun” si se aplica pentru doua numere naturale.

Problema. Fie doua numere naturale A si B. Sa se determine cel mai mare divizor comun a lui A si B.

Sa citim iar. Practic trebuie sa determin un numar natural care sa fie divizor atat pentru A cat si pentru B. Daca sunt mai multe numere in aceasta situatie, atunci il aleg pe cel mai mare. Ceea ce ma duce cu gandul la

Varianta 1.

citeste A, B; 

cmmdc=0;

pentru D=1 pana la A executa

       daca (A%D==0 si B%D==0 ) atunci cmmdc=D;

scrie cmmdc;

Practic, cmmdc-ul va fi cel mult unul dintre numere. As putea sa fiu prevazator si sa aleg ca limita superioara pe cel mai mic dintre A si B. Si conditia de numitor comun se poate rescrie A%D +B%D==0.

Varianta 2.

citeste A,B

min=A; daca (min>B) atunci min=B;

pentru D=1 pana la min executa

       daca (A%D +B%D==0) atunci cmmdc=D;

scrie cmmdc;

Varianta 3.

Problema nu e noua, Euclid (cca 325 – 265 î.Hr.!!!!!) s-a gandit si el la acelasi lucru si a gasit o solutie.

 

OBS. M-am gandit de multe ori cum sa explic elevilor ce anume l-a facut pe Euclid sa se gandeasca la problema cmmdc si mi-am imaginat urmatorul scenariu: Euclid avea o camera de latime A si lungime B pe care sotia lui vroia sa o acopere cu placi patrate de gresie. Pentru a-si impresiona prietenele, placile trebuiau sa acopere integral suprafata camerei si sa fi cat mai mari. Cum a rezolvat Euclid problema? Practic trebuie desenat un caroiaj cu patrate de latura CMMDC.

Daca D este divizorul comun a lui A si B, atunci estista A2 si B2 asa incat:

  • A=D*A2
  • B=D*B2 si deduce ca si diferenta acestor numere are acelasi divizor comun
  • A-B=D*(A2-B2)

Practic, in “lenea” lui de a calcula cmmdc(A,B), Euclid propune mereu o pereche mai mica (A-B, B) daca A>B sau (A, B-A) daca B>A. Deci, cmmdc(A, B) este

  • (A-B, B) daca A>B
  • (A, B-A) daca B>A
  • A daca A==B

Se observa ca in primele doua cazuri trebuie sa reluam algoritmul, ceea ce ne duce cu gandul la urmatoarea secventa:

citeste A,B

cat timp (A!=B) executa

daca (A>B) atunci A=A-B;

            altfel B=B-A;

scrie A;

Varianta 4.

Deci varianta 3 e de acum 2000 de ani! Intre timp, s-a mai facut o varianta. Daca A=23456 si B=89 ar trebui sa se efectueze o multime de scaderi a lui B din A. Scaderi repetate, pana nu se mai poate scadea pe B din A! Asta este o impartire si ce ramane in A este restul. In consecinta, pe cel mai mare il vom transforma in restul impartirii. Cand ne oprim? Ne vom opri cand A sau B vor fi nule, ceea ce inseamna ca cealalta valoare, nenula, va fi CMMDC.

citeste A,B;

cat timp (A*B!=0) executa //daca nici unul nu e nul….

daca (A>B) atunci A=A%B;

            altfel B=B%A;

scrie A+B; //afisez valoarea nenula

Varianta 5.

Desi varianta 4 e o solutie respectabila, inca nu e de ajuns. Practic, la fiecare iteratie se executa 2 teste – cel din CAT TIMP si cel din DACA. Varianta urmatoare foloseste aceeasi idee de mai sus dar elimina unul din teste.

citeste A,B;

cat timp (B!=0) executa

{R=A%B; A=B; B=R;}

//se iese cand B este nul=>

scrie A;

Analiza variantelor

Evident, ultima varianta este cea mai buna. Am explicat deja ratiunile prin care s-a trecut de la o varianta la alta. In vederea examenului de bacalaureat va trebuie toate variantele, indeosebi ultima pentru momentul cand va trebui sa programati.

Calculul CMMMC

Pentru calculul matematic a cmmdc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni, la puterea cea mai mica.

Pentru calculul matematic a cmmmc pentru doua numere A si B, se realizeaza descompunerea in factori primi si apoi se considera termenii comuni si necomuni, la puterea cea mai mare.

Practic daca as scrie produsul A*B ca inmultire intre descompunerile lor, as observa ca toti termenii existenti sunt fie parte a CMMDC, fie parte a CMMMC. De aici apare si relatia A*B=CMMDC(A,B)*CMMMC(A,B). Practic ne vom folosi de CMMMC(A,B)=A*B/CMMDC(A,B).

citeste A,B

A2=A; B2=B; //salvez separat datele initiale

//calculez CMMDC

cat timp (B!=0) {R=A%B; A=B; B=R;}

//afisez CMMMC

scrie “CMMMC este “, A2*B2/A.

 
8 Comments

Posted by on 28/09/2012 in C2_1. Algoritmica

 

Tags: ,

L7.2. Care instructiune repetitiva este mai buna?

Desi sunteti tentati sa alegeti trebuie sa stit ca ambele instructiuni au aceeasi capacitate. Toata problema este sa verificati in algoritmul dumneavoastra daca trebuie sau nu efectuat un test inainte de executarea instructiunii/instructiunilor de repetat.

Simularea instructiunii CAT TIMP EXECUTA cu EXECUTA CAT TIMP. Instructiunea CAT TIMP EXECUTA intai testeaza si apoi executa; daca comparam secventele de executie observam ca la CAT TIMP EXECUTA intai apare un test/conditie. si apoi este identica cu EXECUTA CAT TIMP; nu ramane decat sa folosim o instructiune de test pentru aceasta conditie;

cat timp (exp_logica) executa instructiune; daca (exp_logica) atunciexecuta instructiune cat timp (exp_logica)

Observati ca pentru transformarea unei instructiuni cat timp in una executa cat timp, nu trebuie dacat sa identificati conditia si secventa care se repeta; apoi copiati corespunzator in sablon.

Simularea instructiunii  EXECUTA CAT TIMP cu CAT TIMP EXECUTA .

executa instructiune cat timp (exp_logica); instructiune;cat timp (exp_logica) executa instructiune;

Simularea instructiunii REPETA PANA CAND cu EXECUTA CAT TIMP.

repeta instructiune pana cand (exp_logica); executa instructiune cat timp!(exp_logica)


Simularea instructiunii  PENTRU
 cu CAT TIMP EXECUTA .

pentru i<-A pana la B cu pasul C executa instructiune.  i <- A;cat timp (i<=B) executa {instructiune; i<-i+C};
 
Leave a comment

Posted by on 28/09/2012 in C2_1. Algoritmica

 

Tags: , , , , , , ,

L10. Algoritmi fundamentali. Divizibilitate. N este prim?

Divizibilitate

Problema. Pentru un N dat, care sunt divizorii lui N?

Multimea divizorilor lui N este cuprinsa intre valorile 1 si N. Un numar D este divizor al lui N daca N se imparte exact la D. Pentru noi, impartirea exacta inseamna ca restul impartirii lui N la D este zero. Trebuie sa cautam acele valori intre 1 si N la care N se imparte exact. Vom aifsa si vom numara aceste valori.

natural N, D, NR;
NR=0;
citeste N;
pentru D=1, N executa 
               daca (N%D==0) atunci { scrie D; NR=NR+1}
scrie NR;

Cu numarul de divizori putem stabili daca numarul N este prim.

daca (NR==2) atunci scrie N, " este prim!"

Este N numar prim?

Problema. Fie N un numar natural. Este N numar prim?

Conform matematicii un numar N este prim daca are drept divizori pe 1 si pe N.

Varianta 1. Ideea este sa realizam cat mai putine teste, astfel incat algoritmul sa se incheie mai repede

  • D=2;
  • cat timp (D<=N-1 si N%D!=0) executa D=D+1;
  • daca (N%D==0) atunci scrie  “divizibil”
  • altfel scrie “prim”

Am redus doua teste : nu mai testam cazul D=1 si D=N. De asemenea, profitam de situatia in care gasim primul divizor pentru a iesi din repetitie. Totusi, pentru cazul in care numarul ar fi prim, inca se executa N-2 pasi.

Varianta 2. Numarul 2 este cel mai mic potential divizor. Deduc ca numarul N/2 este cel mai mare potential divizor.

  • D=2;
  • cat timp (D<=N/2 si N%D!=0) executa D=D+1;
  • daca (N%D==0) atunci scrie  “divizibil”
  • altfel scrie “prim”

In aceasta varianta se executa, in cel mai rau caz, N/2 operatii. Super! Am redus munca la jumatate! Se poate mai bine?

Varianta 3. Sa cercetam, in continuare, perechile de potential divizori: 2 cu N/2, 3 cu N/3, 4 cu N/4, …. Observ ca pe masura ce primul termen creste, al doilea scade. Deduc ca, la un moment dat cei doi termeni pot fi egali. Adica ar putea fi un element X astfel incat N==X*X sa fie adevarat! In consecinta X=radical(N) . Deci ultima pereche care ar trebui studiata este cea cu radical (N).

  • D=2;
  • cat timp (D<=radical(N) si N%D!=0) executa D=D+1;
  • daca (N%D==0) atunci scrie  “divizibil”
  • altfel scrie “prim”

Este cert ca radical(N)<N/2. Iata ca am obtinut un numar mai mic de operatii. Sa cercetam cat de eficienti sunt  algoritmii nostri.

Numarul N=611953 este prim, spun unii.

  • varianta 1 va executa maxim 611951 pasi
  • varianta 2 va executa maxim  305 976 pasi
  • varianta 3 va executa maxim 782 pasi!!!!!!!

E ceva, nu?

Varianta 4. Si inca mai merge…

  • daca (N==2) atunci scrie “prim”
  • altfel daca (nN%2==0 ) atunci scrie “divizibil”
  • altfel {
    • D=3;
    • cat timp (D<=radical(N) si N%D!=0) executa D=D+2;
    • daca (N%D==0) atunci scrie  “divizibil”
    • altfel scrie “prim” }

Algoritmul de mai sus verifica daca N este 2 si elimina din discutie numerele pare. Pentru ca majoritatea numerelor prime sunt impare, parcurg numai valorile impare si le intreb daca nu cumva sunt divizori pentru N.

Varianta 4 va efectua maxim 390 pasi pentru N=611953.

 
2 Comments

Posted by on 05/03/2012 in C2_1. Algoritmica

 

Tags: , , , , , ,

L9. Algoritmi fundamentali. Siruri de numere

Pentru a prelucra un sir de numere trebuie sa stim fie numarul de valori in discutie (sir cu numar cunoscut de valori), fie sa avem o valoare care sa marcheze sfarsitul sirului (de obicei  – zero).

Prelucrarea unui sir cu numar cunoscut de valori

De vreme ce stim cate valori vor fi in sir (prelucrarea va fi retetat de un numar cunoscut de ori) putem folosi instructiunea FOR/PENTRU.

natural x, n, i;
citeste N
pentru i=1,N executa 
              {  citeste X;
                //prelucrez X
               ........
               }

Prelucrarea unui sir cu un numar necunoscut de valori (care se incheie cu zero)

Valoarea zero nu face parte din sir si nu trebuie prelucrata. Nu stim exact cand primim valoarea zero (care marcheaza sfarsitul sirului), motiv pentru care la fiecare citire trebuie sa verificam daca s-a citit zero sau nu.Daca valoarea citita nu este zero avem de realizar prelucrarea ceruta de problema si o noua citire.

citeste x; 
cat timp (x!=0) {
              //prelucrez valorea X
             .........
             //trec la valoarea urmatoare
            citeste X
            }

Probleme

  1. Sa se calculeze suma/produsul valorilor din sir
  2. Sa se determine valoarea minima/maxima dintre valorile citite.
  3. O valoare data Y se gaseste in sir?
  4. De cate ori apare o valoare data Y?
  5. Presupunand ca sirul reprezinta coeficientii uni polinom ( dati incepand cu gradul cel mai mic), calculati valoarea polinomului intr-un punct Y.
 
4 Comments

Posted by on 05/03/2012 in C2_1. Algoritmica

 

Tags:

 
Follow

Get every new post delivered to your Inbox.

Join 1,460 other followers

%d bloggers like this: