Documente Academic
Documente Profesional
Documente Cultură
primi interesante ce vor face rezolvarea unor anumite cerințe din problemele de
informatică mult mai ușoară , dar și eficientă din punct de vedere al timpului și
memoriei.
O soluție mult mai eficientă constă în folosirea urmă toarei propietă ți. Vom
folosi ca notații:
𝑝 – factorul prim
𝑒 – exponentul factorului prim.
Aplică m propietatea de mai sus. Luă m exponentul primului factor prim. Adună m
cu 1 și înmulțim cu exponentul urmă torului avâ nd grijă ca acesta să fie adunat
tot cu 1.
𝐷36=(2+1)*(2+1)
𝐷36=3*3
𝐷36=9 => Obținem că numă rul 36 are 9 divizori.
int nrDiv(int a)
{
/*
In e stocam exponentul factorului prim pe care il parcurgem
d - Reprezinta factorul prim gasit
rez - Rezultatul final */
int e,d,rez;
e=0; // Initializam exponentul cu 0
while(a%2==0) //Luam cazul special: singurul numar prim par este 2.
{
a/=2;
e++;
}
/*Initializam rezultatul cu primul exponent gasit.
Chiar daca exista sansa ca 2 sa nu fie factor prim al numarului
caruia dorim sa ii gasim numarul divizorilor rezultatul tot este initializat
cu 1 fiindca exponentul este initializat cu 0.
*/
rez=e+1;
d=3; //Urmatorul nr. prim este 3.
while(a>1 && d*d<=a) /*Parcurgem intervalul [2, radical(n)]*/
{
e=0;
while(a%d==0)
{
a/=d;
e++;
}
//Inmultim la rezultat exponentul gasit.
//Nu uitam sa fie adunat cu 1.
rez*=(e+1);
d+=2;
}
if(a>1)
rez*=2;
return rez; //Final.
}
Suma divizorilor unui număr
O soluție reprezintă determinarea divizorilor în mod asemă nă tor ca mai sus, însă
adună m divizorii într-o variabilă .
Pentru a afla mult mai repede suma divizorilor unui numă r vom folosi
urmă toarea propietate:
Să luă m ca exemplu tot numă rul 36. Ș tim că descompunerea acestuia în factori
primi este 36=22∗32. Divizorii acestuia sunt: 1,2,3,4,6,9,12,18,36-suma acestora
este 91.
𝑆36=2(2+1)−1/(2−1)*(3(2+1)−1)/(3−1)
𝑆36=(23−1)/1*(33−1)/2
𝑆36=7⋅26/2
𝑆36=7⋅13=91
𝑆36=91 => Suma divizorilor numă rului 36 este 91.
O implementare în C++:
#include <iostream>
using namespace std;
int SumDiv(int n) {
int e, p, d;
e = 1;
p = 1;
while (n % 2 == 0) {
n /= 2;
e *= 2;
}
e *= 2;
e--;
p = e;
while (n % d == 0) {
n /= d;
e *= d;
}
e *= d;
e--;
e = e / (d - 1);
p *= e;
}
if (n > 1)
p *= (1 + n);
return p;
}
int main()
{int x=36;
cout<<SumDiv(x);
return 0;
}
Indicatorul Euler
Indicatorul Euler( sau funcția totent ) determină numărul de valori mai
mici sau egale cu un număr dat și prime cu acesta. Aceasta se notează 𝜙(𝑛) și
se poate afla aplicâ nd urmă toarea propietate:
int Indicatorul_Euler(int n)
{
int i,euler=n;
if(n==1) //Caz special cand n=1 returnam 0
return 0;
if(n%2==0) //Singurul nr prim par 2...
{
euler -= euler/2; //Aplicam formula lui euler de mai sus.
while(n%2==0)
n/=2;
}
for(i=3; i*i<=n; i+=2) //Factorii sunt primi deci daca am gasit 2 ca fiind factor
prim, acela fiind singurul par, cautam doar cei impari
{
if(n%i==0)
{
euler -= euler/i; //De asemenea...
while(n%i==0)
n/=i;
}
}
if(n>1)
euler -= euler/n;
return euler;
}