Sunteți pe pagina 1din 3

Suma si numarul divizorilor unui numar.

1. Să se scrie un program care afișează divizorii comuni ai două numere


naturale citite de la tastatură.

Solutie.

#include<iostream>
using namespace std;
long long a,b,a1,b1,p=1,d,d1,i;
long cmmdc(long a, long b)
{
long r=0;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
cin>>a>>b;

d=cmmdc(a,b);

for(i=1;i<=d;i++)
if(d%i==0)
cout<<i<<" ";
return 0;
}

2.

Fiind elev în clasa a IX-a, George, îşi propune să studieze capitolul


divizibilitate cât mai bine. Ajungând la numărul de divizori asociat unui num ăr
natural, constată că sunt numere într-un interval dat, cu acelaşi num ăr de
divizori. De exemplu, în intervalul [1, 10], 6, 8 şi 10 au acelaşi număr de
divizori, egal cu 4. De asemenea, 4 şi 9 au acelaşi număr de divizori, egal
cu 3 etc.

Scrieţi un program care pentru un interval dat determină care este cel
mai mic număr din interval ce are număr maxim de divizori. Dacă sunt
mai multe numere cu această proprietate se cere să se numere câte
sunt.

Solutie:
#include <fstream>

using namespace std;

ifstream in("maxd.in");
ofstream out("maxd.out");
const int N=45000;
bool c[N];
int prim[N],np;
void ciur(){
int i ,j;
for(i=2;i*i<N;i++)
if(!c[i])
for(j=i*i;j<N;j+=i)
c[j]=true;
for(i=2;i<N;i++)
if(!c[i]){
++np;
prim[np]=i;
}
}
int div(int n)
{
int i , p , nr=1;
for(i=1;prim[i]*prim[i]<=n;i++)
{
if(n%prim[i]==0)
{
p=0;
while(n%prim[i]==0)
{
n/=prim[i];
p++;
}
nr*=p+1;
}
}
if(n!=1)
nr*=2;
return nr;
}
int main()
{
int a ,b , i ,nr, max ,ret, d;
ciur();
in >> a >>b;
max = 0;
for(i=a;i<=b;i++)
{
d = div(i);
//out << d << "\n";
if(d>max)
{
ret=i;
max=d;
nr=1;
}
else if(d==max) nr++;
}
out<<ret<<" ";
out<<max<<" ";
out<<nr;
return 0;
}

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