Algoritmi elementari
October 4, 2017 | Author: anon_933693525 | Category: N/A
Short Description
Download Algoritmi elementari...
Description
Prelucrarea cifrelor unui număr
Pas 1 Pas 2 Pas 3 Pas 4 Pas 5 Pas 6
Exemplu n=125346 c=6, n=12534 c=4, n=1253 c=3, n=125 c=5, n=12 c=2, n=1 c=1, n=0
Cât timp n≠0 execută cn%10 n[n/10]
Observații Se observă că, pentru obținerea tuturor cifrelor, se execută un număr de 6 pași, deoarece numărul natural n este format din 6 cifre. Cifrele numărului pot fi extrase de la dreapta la stânga, prin împărțiri la 10. Ultima cifră este restul împărțirii numărului n la 10 și se poate obține după formula c=n%10. După obținerea ultimei cifre, aceasta se taie din număr, numărul actualizându-se după formula n=[n/10], adică câtul împărțirii lui n la 10. După obținerea tuturor cifrelor, n devine 0. Algoritmul în pseudocod repetă cn%10 n[n/10] până când n=0;
Suma cifrelor unui număr
Pas 1 Pas 2 Pas 3 Pas 4 Pas 5 Pas 6
Exemplu n=125346, S=0 c=6, n=12534, S=0+6=6 c=4, n=1253, S=6+4=10 c=3, n=125, S=10+3=13 c=5, n=12, S=13+5=18 c=2, n=1, S=18+2=20 c=1, n=0, S=20+1=21
S0 cât timp n≠0 execută cn%10 n[n/10] SS+c
Observații Folosind algoritmul de descompunere în cifre, prelucrarea cifrei c constă în adăugarea ei la suma S a cifrelor lui n. Inițial S=0, deoarece 0 este elementul neutru la adunare. Actualizarea lui S este: S=S+c ⟺ S=S+n%10
Algoritmul în pseudocod S0 repetă cn%10 n[n/10] SS+c până când n=0;
Oglinditul unui număr Exemplu Observații n=125346, og=0 Folosim algoritmul de descompunere în cifre. S- a observat că pentru obținerea cifrelor numărul se împarte la 10, atâta Pas 1 c=6, n=12534, og=6 timp cât mai are cifre. Pas 2 c=4, n=1253, og=6*10+4=64 Operația inversă, de construire a unui număr având cifrele la Pas 3 c=3, n=125, og=64*10+3=643 dispoziție, se va face prin operații de înmulțire cu 10. Pas 4 c=5, n=12, og=643*10+5=6435 Inițial og=0, deoarece oglinditul nu a fost construit. Pas 5 c=2, n=1, og=6435*10+2=64352 Actualizarea lui og este: og=og*10+c ⟺ og=og*10+n%10 Pas 6 c=1, n=0, og=64352*10+1=643521 Algoritmul în pseudocod og0 og0 cât timp n≠0 execută repetă cn%10 cn%10 n[n/10] n[n/10] ogog*10+c ogog*10+c până când n=0; Palindrom: un număr natural egal cu oglinditul său n=135 , og=531 ⇒n nu este palindrom n=232, og=232 ⇒n este palindrom
Divizibilitate: x este divizibil cu y dacă restul împărțirii lui x la y este 0, adică x%y=0 Divizorii unui număr m=12 1 2 3 4 6 12 – toți divizorii numărului 12 1 și 12 se numesc divizori improprii 2 3 4 6 – divizori proprii
citește m pentru d2,[m/2] execută, dacă m%d=0 atunci
m=35 1 5 7 35
Observații Toți divizorii numărului se găsesc în intervalul [1,12], pentru m=12, pe caz general [1,m]
1, 35 – divizori improprii 5, 7 – divizori proprii
Se observă că cel mai mic divizor propriu poate fi 2, iar cel mai mare divizor propriu poate fi cel mult jumătatea numărului. Deci, intervalul în care se caută divizorii proprii este [2, m/2]. Algoritmul în pseudocod – prelucrare divizori proprii citește m citește m d2 d2 cât timp d≤[m/2] execută repetă dacă m%d=0 atunci dacă m%d=0 atunci dd+1
dd+1 până când d>[m/2]
Testare primalitate: un număr x este prim dacă are ca divizori doar pe 1 și el însuși, deci nu are divizori proprii, are doar divizori improprii. x=15 1, 3, 5, 15 – divizorii lui 15 Nu este număr prim deoarece are divizori proprii
citește x prim1 pentru d2,[x/2] execută, dacă x%d=0 atunci prim0 dacă prim=1 atunci scrie ”număr prim” altfel scrie ”nu este număr prim”
x=17 1, 17 – divizorii lui 17 Este număr prim deoarece nu are decât divizori improprii
Observații Pentru a verifica dacă un număr este prim, demonstrăm prin reducere la absurd: - presupunem că x este număr prim și demonstrăm contrariul - căutăm divizori proprii dacă se găsește un astfel de divizor, presupunerea devine falsă Algoritmul în pseudocod – primalitatea unui număr citește x citește x prim1 prim1 d2 d2 cât timp d≤[x/2] și prim=1 execută repetă dacă x%d=0 atunci dacă x%d=0 atunci prim0 prim0 dd+1 dacă prim=1 atunci scrie ”număr prim” altfel scrie ”nu este număr prim”
dd+1 până când d>[x/2] sau prim=0 dacă prim=1 atunci scrie ”număr prim” altfel scrie ”nu este număr prim”
Descompunerea unui număr în factori primi n=12 n d 12 2 6 2 3 3 1
n=150 n d 150 2 75 3 25 5 5 5 1
Observații Primul factor prim posibil este d2 Se descompune numărul în factori primi până când devine 1 sau cât timp este ≠1 (cât timp n≠1) - Pentru fiecare factor prim d, se împarte numărul la d, atâta timp cât este posibil (cât timp n%d=0) - Când n nu se mai împarte la d, se trece la următorul factor prim (dd+1) Algoritmul în pseudocod d2 //primul factor prim posibil d2 cât timp n≠1 execută repetă p0 //puterea la care apare factorul prim p0 cât timp n%d=0 execută //se împarte n la d cât timp este posibil cât timp n%d=0 execută pp+1 pp+1 n[n/d] n[n/d] dacă p≠0 atunci scrie d,’ ‘ dd+1 ≠
n=28 n d 28 2 14 2 7 7 1
-
dacă p≠0 atunci scrie d,’ ‘ dd+1 ≠ până când n=1
CMMDC- cel mai mare divizor comun a=12, b=32 2
a=2 *3 b=25 CMMDC a două numere este cel mai mare număr care le divide pe ambele. cmmdc(12,32)=22=4 -comun la puterea cea mai mică
cmmmc(12,32)=25*3=96 - comun și necomun la puterea cea mai mare cmmmc(12,32)=(12*32)/cmmdc(12,32)
Cmmdc – Algoritmul lui Euclid, cu resturi Fie a si b doua numere întregi, unde |a| > |b| sau |a| = |b|, b nenul. 1) Se împarte |a| la |b|; dacă restul împărţirii este 0, atunci b este un c.m.m.d.c. ; 2) Dacă restul împărţirii este nenul, se împarte |b| la primul rest (restul împărţirii de mai sus) şi obţinem al doilea rest; 3) Împărţim, apoi, primul rest la al doilea şi obținem un nou rest (al treilea) şi aşa mai departe; 4) Ultimul rest nenul este c.m.m.d.c. al celor 2 numere. Observaţii: a) Dacă ultimul rest nenul este 1, atunci numerele sunt prime între ele; Dacă CMMDC(a, b) = 1, atunci a și b sunt prime între ele. Această proprietate nu depinde de primalitatea lui a și a lui b. De exemplu, numerele 6 și 35 nu sunt numere prime, deoarece ambele au doi factori: 6 = 2 × 3 și 35 = 5 × 7. Cu toate acestea, 6 și 35 sunt prime între ele. Niciun alt număr natural în afară de 1 nu divide și pe 6 și pe 35, deoarece ele nu au niciun factor prim în comun. b) Algoritmul lui Euclid se poate folosi şi pentru aflarea c.m.m.d.c. al mai multor numere, de pilda a,b,c. Se calculează mai întâi (a,b) = d, apoi (c,d) = e. CMMDC(a, b, c) = CMMDC(a, CMMDC(b, c)) = CMMDC(CMMDC(a, b), c) = CMMDC(CMMDC(a, c), b). Algoritmul în pseudocod Exemplu citeste a,b a=12, b=32 cmmdc(12,32)=4 ra%b r12%32=12 cât timp r≠0 execută r≠0 (12≠0) Adevărat ab a32 br b12 ra%b r32%12=8 r≠0 (8≠0) Adevărat cmmdcb a12 scrie cmmdc b8 r12%8=4 r≠0 (4≠0) Adevărat a8 b4 r8%4=0 r≠0 (0≠0) Fals cmmdcb=4
OBSERVAȚIE: În urma calcului cmmdc numerele se modifică. Pentru a le folosi apoi trebuie să realizăm o copie.
Cmmdc – Algoritmul lui Euclid, cu diferențe 𝑎, 𝑑𝑎𝑐ă 𝑎 = 𝑏 cmmdc(a,b)= 𝑐𝑚𝑚𝑑𝑐 𝑎 − 𝑏, 𝑏 , 𝑑𝑎𝑐ă 𝑎 > 𝑏 𝑐𝑚𝑚𝑑𝑐 𝑎, 𝑏 − 𝑎 , 𝑑𝑎𝑐ă 𝑏 > 𝑎 Algoritmul în pseudocod Exemplu citește a,b a=12, b=32 cmmdc(12,32)=4 cât timp a≠b execută 12≠32 Adevărat dacă a>b atunci 12>32 Fals aa-b b32-12=20 altfel 12≠20 Adevărat bb-a 12>20 Fals b20-12=8 cmmdca 12≠8 Adevărat scrie cmmdc 12>8 Adevărat a12-8=4 4≠8 Adevărat 4>8 Fals b8-4=4 4≠4 Fals cmmdc4
OBSERVAȚII: a. În urma calcului cmmdc numerele se modifică. Pentru a le folosi apoi trebuie să realizăm o copie. b. Algoritmul lui Euclid cu resturi este mai rapid decât algoritmul prin scăderi repetate pentru că folosim împărțire.
Citirea unui șir de numere până la întâlnirea valorii 0, care nu face parte din șir Algoritmul în pseudocod citeste a repetă cât timp a execută citește a dacă a≠0 atunci citește a până când a=0 Citirea unui șir de n numere Algoritmul în pseudocod citește n pentru in,1,-1 execută citește a
citește n pentru i1,n,1 execută citește a
Prelucrarea numerelor dintr-un interval [a,b]
citește a,b pentru ia,b,1 execută copiai
Algoritmul în pseudocod citește a,b ia cât timp i≤b execută copiai ii+1
citește a,b pentru ib,a,-1 execută copiai
View more...
Comments