Sunteți pe pagina 1din 7

Prof.

GAL CARMEN

ALGORITMI PENTRU PRELUCRAREA DIVIZORILOR UNUI NUMĂR

Contents
ALGORITMI PENTRU PRELUCRAREA DIVIZORILOR UNUI NUMĂR .............................................. 1
1. ALGORITMI PENTRU GENERAREA DIVIZORILOR UNUI NUMĂR ............................................ 1
2. AFIȘAREA DIVIZORILOR PARI/IMPARI AI UNUI NUMĂR ........................................................ 2
3. SUMĂ/PRODUS DIVIZORI.................................................................................................................... 4
4. NUMĂR PERFECT .................................................................................................................................. 4
5. NUMĂR DIVIZORI .................................................................................................................................. 5
6. ALGORITMUL PENTRU GENERAREA DIVIZORILOR PRIMI AI UNUI NUMĂR .................. 5
7. ALGORITMUL PENTRU DESCOMPUNEREA ÎN FACTORI PRIMI AI UNUI NUMĂR ......... 6

1. ALGORITMI PENTRU GENERAREA DIVIZORILOR UNUI NUMĂR


Algoritmul de generare a divizorilor proprii ai unui număr n constă în împărțirea numărului la un șir de
numere d←2,[n/2]. Dacă numărul n se împarte la numărul generat atunci d este un divizor al lui n. Pașii
algoritmului sunt:
Pasul 1: Se citește n
Pasul 2: Se afișează 1,n (divizori ai lui n)
Pasul3: Se inițializează șirul de numere cu care se va împărți n cu primul divizor posibil, prin operația
d←2
Pasul 4: Dacă d îl divide pe n, atunci se afișează d
Pasul 5: Se incrementează cu 1 numărul la care se împarte n, prin d←d+1
Pasul 6: Dacă d<=n/2 atunci se revine la pasul 4, altfel se termină algoritmul
întreg n,d;
început 1.Se afișează 1,6
citește n; 2.d=2 6 mod 2=0 T se afișează 2
scrie 1,n; 3.Se incrementează d cu 1 d=2+1=3
pentru d←2,n/2 execută 4. d<=n/2 3<=6/2 T
dacă n mod d=0 atunci scrie d,” “; 5. d=3 6 mod 3=0 T se afișează 3
6. Se incrementează d cu 1 d=3+1=4
sfârșit
7. d<=n/2 4<=6/2 F se iese din structura repetitivă
ex: n=6
și algoritmul se încheie
Obs: Dacă se cere afișarea tuturor divizorilor în ordine crescătoare (de ex. pt n=6: 1,2,3,6) atunci
algoritmul îl vom modifica astfel:
Prof. GAL CARMEN

întreg n,d;
început
citește n;
scrie 1;
pentru d←2,n/2 execută
dacă n mod d=0 atunci scrie d,” “;
scrie n;
sfârșit
Sau se mai poate scrie și așa, dar este mai puțin eficient:
întreg n,d;
început
citește n;
pentru d←1,n execută
dacă n mod d=0 atunci scrie d,” “;
sfârșit

2. AFIȘAREA DIVIZORILOR PARI/IMPARI AI UNUI NUMĂR


De ex. dacă avem enunțul problemei de mai jos:
Se citește n, număr natural. Se cere să se afișeze divizorii pari ai numărului:
Cum va trebui să modificăm algoritmul în așa fel încât să afișăm doar divizorii pari ai numărului?
Obs:1 nu este divizor par. Deci nu îl afișăm. Pe urmă, în momentul în care luăm divizorii posibili d←2,[n/2], în
plus, va trebui să testăm dacă d este un divizor par (d mod 2=0) și dacă da atunci îl afișăm. Pentru n testăm dacă
este par (n mod 2=0) îl afișăm.
întreg n,d;
început
citește n;
pentru d←2,n/2 execută
dacă n mod d=0 and d mod 2=0 atunci scrie d,” “;
dacă n mod 2=0 atunci
scrie n;
sfârșit
O altă idee ar fi să luăm doar divizorii pari ai numărului: adică d=2,4,6,...n/2, adică incrementarea lui d să o facem
cu 2:
Prof. GAL CARMEN

întreg n,d;
început
citește n;
pentru d←2,n/2,2 execută
dacă n mod d=0 atunci scrie d,” “;
dacă n mod 2=0 atunci
scrie n;
sfârșit
Dar, dacă se cereau cei impari?
Se citește n, număr natural. Se cere să se afișeze divizorii impari ai numărului:
Ce trebuia să modificăm la algoritm?
În primul rând 1 este divizor impar.
Știm că pentru un număr impar restul împărțirii la doi este diferit de zero. Și atunci condiția pe care o vom
pune va fi d mod 2<>0, respectiv n mod 2<>0
întreg n,d;
început
citește n; scrie 1,” “;
pentru d←3,n/2 execută
dacă n mod d=0 and d mod 2<>0 atunci scrie d,” “;
dacă n mod 2<>0 atunci
scrie n;
sfârșit
Sau dacă luăm doar divizorii impari ai numărului: 1,3,5,7,etc... adică divizorul d va lua valori din 2 în 2, dispare
condiția prin care testăm dacă este un divizor impar (mai puțin pentru n):
întreg n,d;
început
citește n; scrie 1,” “;
pentru d←3,n/,2 2 execută
dacă n mod d=0 atunci scrie d,” “;
dacă n mod 2<>0 atunci
scrie n;
sfârșit
Prof. GAL CARMEN

3. SUMĂ/PRODUS DIVIZORI
Se citește n, număr natural. Se cere să se afișeze suma, respectiv produsul divizorilor săi.
Algoritmul este foarte asemănător cu cel de la afișarea divizorilor, dar de data aceasta va trebui să adăugăm
divizorii la o sumă (care inițial este egală cu 1+n), respectiv să înmulțim la un produs (care inițial este egal cu n).
întreg n,d,s,p;
început
citește n;
s←1+n; p←n;
pentru d←2,n/2 execută
dacă n mod d=0 atunci
s←s+d;
p←p*d;
scrie s,” “,p;
sfârșit
O altă metodă de rezolvare, mai eficientă ar fi dacă am pleca de la următoarea observație:
Dacă d este un divizor al numărului n, înseamnă că și n/d este un divizor al numărului n.
De ex: n=18 divizorii sunt 1, 2, 3, 6, 9, 18. Inițial s=0,p=1
Observăm că dacă:
d=1 n/d=18/1=18 divizor s=s+d+n/d=0+1+18=19 p=p*d*n/d=1*1*18=18
d=2 n/d=18/2=9 divizori s=s+d+n/d=19+2+9=30 p=p*d=18*2*9=324
d=3 n/d=18/3=6 divizori s=s+d+n/d=30+3+6=39 p=p*d=324*3*6=5832
Și atunci ar trebui să luăm divizorii d←1, sqrt(n)-1 și dacă d este divizor, înseamnă că și n/d este divizor și îi
adăugăm la sumă, respectiv îi înmulțim la produs.
Obs: Există cazul particular în care numărul este pătrat perfect; ex. n=16 care are ca și divizori pe
1,2,4,8,16. De data aceasta dacă am gândi la fel înseamnă că pentru d=4, divizorul ar fi adăugat de două ori.
Și acest caz particular trebuie tratat separat
întreg n,d,s,p;
început
citește n;
s←0; p←1;
pentru d←1,sqrt(n)-1 execută
dacă n mod d=0 atunci
s←s+d+n div d;
p←p*d*(n div d);
dacă d=sqrt(n) atunci
s←s+d;
p←p*d;
scrie s,” “,p;
sfârșit
4. NUMĂR PERFECT
Se citește n, număr natural. Se cere să se verifice dacă numărul este perfect sau nu, afișându-se mesajul DA,
respectiv NU. Un număr se numește perfect dacă este egal cu suma tuturor divizorilor săi mai puțin
numărul însuși.
n=6=1+2+3 număr perfect
n=28=1+2+4+7+14 număr perfect
Practic, trebuie să determinăm o sumă a divizorilor pentru d=1,n/2, iar apoi să verificăm dacă suma
determinată este egală cu numărul înseamnă că numărul este perfet, altfel nu.
Prof. GAL CARMEN

întreg n,d,s,p;
început
citește n;
s←1;
pentru d←2,n/2 execută
dacă n mod d=0 atunci
s←s+d;

dacă s=n atunci


scrie “DA”;
altfel
scrie “NU”;
sfârșit
5. NUMĂR DIVIZORI
Ex: Se citește n, număr natural. Se cere să se afișeze numărul de divizori pari.
Vom folosi algoritmul eficient pentru divizori: adică vom lua deodată divizorul d și conjugatul său n/d, și în plus
trebuie să facem verificarea dacă divizorul d este par (d mod 2=0), respectiv conjugatul său n/d este par dacă (n
div d) mod 2=0) și dacă da crește valoarea unei variabile nrdiv cu 1.
întreg n,d,nrdiv;
început
citește n;
nrdiv←0;
pentru d←1,sqrt(n)-1 execută
dacă n mod d=0 atunci
dacă d mod 2=0 atunci nrdiv←nrdiv+1;
dacă (n div d) mod 2=0 atunci nrdiv←nrdiv+1;

dacă d=sqrt(n) and d mod 2==0 atunci


nrdiv←nrdiv+1;
scrie nrpar;
sfârșit
6. ALGORITMUL PENTRU GENERAREA DIVIZORILOR PRIMI
AI UNUI NUMĂR
Pentru afișarea doar a divizorilor primi ai unui număr odată ce am găsit un număr va trebui să impărțim acel număr
la divizor până în momentul în care nu se mai împarte, iar apoi trecem la următorul divizor.
Ex: n=60 are ca și divizori primi pe: 2, 3, 5.
d=2 n mod d=0 (60 mod 2=0)T d=2 divizor prim se afișează
n mod d=0 (60 mod 2=0)T n=n div d=60 div 2=30
n mod d=0 (30 mod 2=0)T n=n div d=30 div 2=15
n mod d=0 (15 mod 2=0)F
d=3 n mod d=0 (15 mod 3=0)T d=3 divizor prim se afișează
n mod d=0 (15 mod 3=0)T n=n div d=15 div 3=5
n mod d=0 (5 mod 3=0)F
d=4 n mod d=0 (5 mod 4=0)F
d=5 n mod d=0 (5 mod 5=0)T d=5 divizor prim se afișează
n mod d=0 (5 mod 5=0)T n=n div d=5 div 5=1
n mod d=0 (1 mod 5=0)F
Primul divizor prim de la care pornim este d=2.
Cât timp se repetă?
Prof. GAL CARMEN

Cât timp numărul este mai mare decât 1 executăm:


a) Verificăm dacă se împarte exact la divizorul d. Dacă da
i. Afișăm divizorul d prim
ii. Căt timp restul este egal cu 0 se împarte numărul
b) Se trece la următorul divizor
Obs: ca să eficientizăm algoritmul și să nu mai luăm numerele pare 4, 6, 8, etc... putem să punem o condiție:
dacă d=2 se va trece la d=3, altfel vom trece la d=d+2, adică: 5,7,9,etc... adică vom lua în continuare numere
impare.
întreg n,d;
început
citește n;
d←2;
cât timp n>1 execută
dacă n mod d=0 atunci
scrie d;
cât timp n mod d=0 execută
n←n div d;
dacă d=2 atunci d←3;
altfel d←d+2;
sfârșit

7. ALGORITMUL PENTRU DESCOMPUNEREA ÎN FACTORI PRIMI AI UNUI NUMĂR


Se citește n, număr natural. Se cere descompunerea numărului n în factori primi.
Obs: Se observă că la descompunerea în factori primi, pe lângă reținerea divizorilor primi (problema anterioară) mai trebuie să reținem și
puterea la care aceștia apar.
Matematic:
16830 = 21 ∗ 32 ∗ 51 ∗ 111 ∗ 171

Primul factor prim de la care pornim este d=2. Cât timp se repetă?
Cât timp numărul este mai mare decât 1 executăm:
a) Initializăm puterea cu 0 pentru fiecare factor prim (p=0)
b) Cât timp numărul n se împarte exact la divizorul d (n mod d=0)
i. Împărțim numărul (n=n div d)
ii. Creștem puterea (p=p+1)
c) Dacă puterea este mai mare decât zero înseamnă că d este un divizor al lui n și atunci:
i. Afișăm factorul prim d și puterea la care apare
d) Se trece la următorul divizor posibil
întreg n,d,p;
început
citește n;
d←2;
cât timp n>1 execută
p←0;
cât timp n mod d=0 execută
n←n div d;
p←p+1;
dacă p>0 atunci
scrie d,”^”,p,”*”;
dacă d=2 atunci d←3;
altfel d←d+2;
sfârșit
Prof. GAL CARMEN

Se citeşte un număr natural n. Să se determine descompunerea în factori primi a lui n.

Intrare
1100
Ieșire
2 2 5 5 11
Numărul n=1100=2*2*5*5*11.

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