Sunteți pe pagina 1din 4

Lecia 5 Algoritmi pentru prelucrarea divizorilor. Numere prime.

Clasa a V-a

Prelucrarea divizorilor unui numr natural nenul

Orice n, numr natural nenul poate avea divizori improprii, proprii sau primi.

Divizorii IMPROPRII: 1 i n (dac n 1).


Observm c 1 este singurul numr care are doar un divizor.

Divizori PROPRII: numere d {2,3,4...,n/2} cu proprietatea c n%d==0

Divizori PRIMI: numere prime d {2,3,...,n/2,n}, cu proprietatea c n%d==0

Exemplu:
n = 36 n = 22 n = 31
Divizori improprii: 1, 36 Divizori improprii: 1, 22 Divizori improprii: 1, 31
Divizori proprii: 2, 3, 4, 6, 12, 18 Divizori proprii: 2, 11 Divizori proprii: nu are
Divizori primi: 2, 3 Divizorii primi: 2, 11 Divizori primi: 31

Prelucrarea divizorilor proprii

Parcurgerea cresctoare sau descresctoare a mulimii divizorilor proprii posibili i verificarea divizibilitii lui n cu
fiecare dintre ei

Pseudocod C++ Explicatii


Pentru d2, n/2 executa for (d=2; d<=n/2; d++) Parcurgere cresctoare /
Daca n%d=0 atunci if(n%d==0) descresctoare a divizorilor
Prelucreaza d prelucreaza d proprii
Posibiliti de prelucrare: afiarea
lor, numrul lor, suma, cel mai
mic sau cel mai mare divizor
Pentru dn/2,1,-1 executa for (d=n/2; d>=2; d--) propriu etc.
Daca n%d=0 atunci if(n%d==0)
Prelucreaza d prelucreaza d

1. Ce proprietate au numerele care au un numr impar de divizori?


2. Dar cele care au exact 3 divizori?

Testul de primalitate verificarea unui numr natural dac este prim

Pas 1. Presupunem ca n este prim (variabila prim primeste valoarea 1)


Pas 2. Daca n<2 atunci n nu este prim si variabila prim primeste valoarea 0
Pas 3. Parcurgem multimea divizorilor proprii posibili si verificam divizibilitatea lui n cu acestia.
Daca exista un divizor propriu, atunci n nu este prim variabila prim primeste valoarea 0.
Pas 4. Prelucram numrul n n functie de valoarea variabilei prim

1
Lecia 5 Algoritmi pentru prelucrarea divizorilor. Numere prime.
Clasa a V-a

Pseudocod C++ Explicatii


prim1 prim=1; Reducerea numarului de operatiii
Daca n<2 atunci if(n<2) prim=0; (micsorarea timpului de executie in cazul
prim0 for (d=2; d*d<=n; d++) numerelor mari si, eventual prime):
if(n%d==0) - Utilizarea instructiunii break determina
Pentru d2, n/2 executa { prim=0; break;} iesirea fortata din bucla for la intalnirea
Daca n%d=0 atunci if(prim==1) unui divizor
prim0 //prelucrare nr prim - Parcurgerea divizorilor pana la cel mai
mare patrat perfect mai mic egal cu n

Exemplu

Testarea primalitii lui n = 1.000.003 (numar prim) prin:


- parcurgerea divizorilor pana la n/2 se vor face 500.000 de comparri
- parcurgerea divizorilor pana cnd d*d>n se vor face aprox 1.000 de comparri (10002=1.000.000)
deci, de 500 de ori mai putine

Si asta doar pentru un numr!!


Dac ai avea de verificat 100.000 de numere mai mici sau egale cu 1.000.000.000?

Prelucrarea divizorilor primi i a exponenilor acestora (din descompunerea n factori primi)

Descompunerea n factori primi a lui n:


Pas 1. Pornim cu d=2 (cel mai mic factor prim posibil)
Pas 2. Ct timp n nu a ajuns la 1 sau nu e numr prim, mprim n la d ct timp e posibil si numrm
mpririle fcute (determinm astfel exponentul factorului prim)
Pas 3. Trecem la urmtorul divizor (l cretem pe d cu 1) i relum Pas 2.

Pseudocod C++
d2 d=2;
Cat timp d*d<=n executa while (d*d<=n){
e 0 e=0;
cat timp n%d=0 executa while (n%d==0){
n n/d n=n/d;
ee+1 e++;
}
Daca e>0 atunci if(e>0) //prelucrare d, e
Prelucreaza d, e d++;
}
if (n>1) // n este ultimul factor prim
dd+1 // si apare la puterea 1

Daca n>1 atunci


Prelucreaza n si 1

2
Lecia 5 Algoritmi pentru prelucrarea divizorilor. Numere prime.
Clasa a V-a

Calcularea numrului de divizori ai lui n, n>0

1. Prin parcurgerea divizorilor proprii i numrarea lor, la care se adaug 2 divizori (1 i n, dac n>1) sau 1
(dac n=1)

nrdiv=0;
for (d=2; d<=n/2; d++)
if(n%d==0) nrdiv++;
if(n==1) nrdiv++;
else nrdiv=nrdiv+2;

OBS: pentru n<1.000.000.000, numrul de operaii de verificare a divizibilitii este foarte mare timp
de execuie mare

2. EFICIENT: Prin formula lui Euler bazat pe descompunerea n factori primi a lui n
e1 e2 ek
Dac n urma descompunerii n factori primi se obine produsul d1 *d2 *...dk unde d1, d2,
...dk sunt factorii primi iar e1, e2,... exponenii acestora, numrul divizorilor lui n se calculeaz
dup formula:
nrdiv = (1+e1)* (1+e2)*...* (1+ek)

Exemplu
3 2
n = 72 = 2 *3
nrdiv = (1+3)*(1+2) = 4*3 = 12
divizorii sunt: 1 2 3 4 6 8 9 12 18 24 36 72
4 2 1 2
n = 87120 = 2 *3 *5 *11
nrdiv = (1+4)*(1+2)*(1+1)*(1+2) = 5*3*2*3 = 90

Implementare C++

nrdiv=1;
d=2;
while (d*d<=n)
{
e=0;
while (n%d==0)
{
n=n/d;
e++;
}
if(e>0) nrdiv=nrdiv*(1+e);
d++;
}
if (n>1) nrdiv=nrdiv*(1+1);

3
Lecia 5 Algoritmi pentru prelucrarea divizorilor. Numere prime.
Clasa a V-a

Probleme propuse

1. Se citete de la tastur un numr natural nenul n<10000. S se afieze pe ecran cel mai mic i cel mai mare
divizor propriu. Dac nu exist se va afia numrul iniial. Ex: pentru n=45 se va afisa 3 15.
2. Se citete de la tastur un numr natural nenul n de cel mult 4 cifre. S se verifice dac suma divizorilor lui
n este un numr prim. Dac da, se va afia suma divizorilor si, altfel se va scrie numrul acestora. Ex:
pentru n=30 se va afisa (1+2+3+5+6+10+15+30=72 nu e prim deci se va afisa 8, num[rul divizorilor)
3. Se citete de la tastur un numr natural impar n<10000. S se afieze pe ecran cel mai mare divizor
2
prim i exponentul acestuia. Ex: pentru n=363=3*11 se va afisa 11 2.
4. Se citesc din fiierul date.in n i k (1<n<1000, 1<k<50), dou numere naturale nenule apoi un ir de
n valori naturale nenule de cel mult 9 cifre, separate prin cte un spaiu. S se scrie n date.out, numerele
care au cel putin k divizori. Rezultatele se vor scrie cte 5 pe o linie, separate prin spaiu. Dac nu exist
niciun numr se va scrie 0. Ex: pentru n=6, k=5 si valorile 14 8 512 24 11 34 se vor afisa 512 24
5. Se citesc din fiierul date.in n i k (1<n<10.000, 1<k<10) apoi un ir de n valori naturale nenule de
cel mult 9 cifre, separate prin cte un spaiu. S se scrie n date.out, numerele din ir care sunt puteri ale lui
k. Rezultatele se vor scrie pe prima linie, separate prin spaiu. Dac nu exist n irul dat nicio putere a lui k
se va scrie 0. Ex: pentru n=6, k=2 si valorile 14 8 512 24 128 1024 se vor afisa 8 512 128 1024
6. Se citete din fiierul date.in n, numr natural nenul de cel mult 9 cifre. S se scrie n date.out, cel mai mic
numr n care are aceeai factori primi n descompunere ca i n. Ex: pentru n=720 se va scrie 30
7. Se citesc din fiierul date.in n (1<n<1000) apoi un ir de n valori naturale nenule de cel mult 9 cifre,
separate prin cte un spaiu. S se scrie n date.out, numrul de cifre de 0 n care s-ar termina produsul
valorilor citite, fr a calcula produsul. Ex: pentru n=4 si valorile 24 8 25 15 se va afisa 3.

Tema
http://campion.edu.ro/arhiva problemele: pin, daruri
http://www.pbinfo.ro/ problemele: 388, 64, 445, 375, 1319, 435, 443

Trimitei soluiile pe adresa mirela.tibu@gmail.com sub forma unei arhive denumit cu numele vostru.
Creai arhiva urmnd paii:
1. Creai un folder cu numelevostru_tema5
2. Copiati una cte una sursele main.cpp n acest folder
i redenumii-le cu numele problemei
3. Arhivai acest folder pastrand numele arhivei identic
cu al folderului
4. Ataai arhiva la email-ul pe care l trimitei la adresa
mirela.tibu@gmail.com

Termen: 14 ianuarie 2016, ora 21


SUCCES!

Vacana plcut i srbtori fericite!


4

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