👤

Cerința

Se dau n numere naturale nenule. Ordonați descrescător cele n numere după numărul lor de divizori.

Date de intrare

Fișierul de intrare sortare_divizori.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire sortare_divizori.out va conține cele n numere aflate pe a doua linie a fișierului de intrare ordonate descrescător după numărul de divizori.

Restricții și precizări

1 ≤ n ≤ 1000

numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000

dacă există mai multe numere care au același număr de divizori, acestea vor fi ordonate crescător



Răspuns :

Răspuns:

include <fstream>

using namespace std;

ifstream fin("sortare_divizori.in");

ofstream fout("sortare_divizori.out");

int v[1000],div_v[1000],n;

int main()

{

int i,j;

fin>>n;

for(i=0;i<n;i++)

{

fin>>v[i];

int x=v[i];

int exp=0;

while(x%2==0)

{

exp++;

x/=2;

}

int nr_div=exp+1;

int d=3;

while(d*d<=x)

{

exp=0;

while(x%d==0)

{

exp++;

x/=d;

}

nr_div*=(exp+1);

d+=2;

}

if(x!=1)

nr_div*=2;

div_v[i]=nr_div;

}

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

if(div_v[i]<div_v[j])

{

swap(v[i], v[j]);

swap(div_v[i], div_v[j]);

}

else

if(div_v[i]==div_v[j])

if(v[i]>v[j])

swap(v[i], v[j]);

for(i=0;i<n;i++)

fout << v[i]<<' ';

return 0;

}

Explicație:

Nu sunt sigur de rezolvare, poate nu e cum faci tu la liceu sper doar sa te fi ajutat putin