Sunteți pe pagina 1din 2

PROBLEME REZOLVATE 1.

S se implementeze o funcie C/C++ care, pentru n i p numere naturale date, s calculeze suma primelor n numere naturale care sunt divizibile cu p. Avem: S = p + 2 p + 3 p + L + np = i p = p i =
i =1 i =1 n n

p n (n + 1) 2

Varianta 1
#include<iostream.h> int suma(int n, int p) { int s=0; for (int i=p; i<=n*p; i+=p) s+=i; return s; } void main() { int n, p; cout<<"\n n ? "; cin>>n; cout<<"\n p ? "; cin>>p; cout<<"\n Suma este "<<suma(n, p); }

Varianta 2
#include<iostream.h> int suma(int n, int p) { int s=0; for (int i=1; i<=n; i++) s+=i*p; return s; } void main() { int n, p; cout<<"\n n ? "; cin>>n; cout<<"\n p ? "; cin>>p; cout<<"\n Suma este "<<suma(n, p); }

Obs. n funcia suma se efectueaz n nmuliri. Varianta 3


#include<iostream.h> int suma(int n, int p) { int s=0, lim; lim=n*p; for (int i=p; i<=lim; i+=p) s+=i; return s; } void main() { int n, p; cout<<"\n n ? "; cin>>n; cout<<"\n p ? "; cin>>p; cout<<"\n Suma este "<<suma(n, p); }

Obs. n funcia suma se efectueaz n nmuliri. Varianta 4


#include<iostream.h> int suma(int n, int p) { int s=n*(n+1)/2*p; return s; } void main() { int n, p; cout<<"\n n ? "; cin>>n; cout<<"\n p ? "; cin>>p; cout<<"\n Suma este "<<suma(n, p); }

Obs. n funcia suma se efectueaz un numr Obs. n funcia suma se efectueaz o singur constant de operaii: dou nmuliri, o mprire nmulire. i o adunare.

PROBLEME REZOLVATE 2. S se implementeze o funcie C/C++ care calculeaz suma divizorilor proprii ai unui numr natural.
Varianta 1
#include <iostream.h> int sumaDivP(int n) { int s=0; int lim=n/2; for(int i=2;i<=lim;i++) if(n%i==0) s+=i; return s; } void main() { int n; cout<<"\n n ? "; cin>>n; cout<<"\n Suma = "<<sumaDivP(n); }

Varianta 2. Micorm numrul de operaii (pai), mergnd cu cutarea divizorilor pn la n i innd cont de faptul c dac i este n divizor al lui n, atunci i este divizor al lui n. i
#include <iostream.h> #include <math.h> int sumaDivP(int n) { int s=0; int lim=sqrt(n); for(int i=2;i<=lim;i++) if(n%i==0) s+=i+n/i; if(lim*lim==n)s-=lim; return s; } void main() { int n; cout<<"\n n ? "; cin>>n; cout<<"\n Suma = "<<sumaDivP(n); }

Varianta 3. Fr utilizarea funciei sqrt


#include <iostream.h> int sumaDivP(int n) { int s=0,i; for(i=2;i*i<=n;i++) if(n%i==0) s+=i+n/i; i--; if(i*i==n)s-=i; return s; } void main() { int n; cout<<"\n n ? "; cin>>n; cout<<"\n Suma = "<<sumaDivP(n); }

Varianta 4
#include <iostream.h> int sumaDivP(int n) { int s=0,i; for(i=2;i*i<n;i++) if(n%i==0) s+=i+n/i; if(i*i==n)s+=i; return s; } void main() { int n; cout<<"\n n ? "; cin>>n; cout<<"\n Suma = "<<sumaDivP(n); }

Obs. n corpul funciei sumaDivP, condiia i*i<=n (a instruciunii for) se poate nlocui cu i<=n/i, evitndu-se n acest fel eventualele depiri atunci cnd se calculeaz i*i.

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