# PBinfo #1608 – Sortare Divizori – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

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

Exemplu:
sortare_divizori.in

5
12 20 4 100 13
sortare_divizori.out

100 12 20 4 13
Explicație
12 are 6 divizori,  20 are 6 divizori,  4 are 3 divizori,  100 are 9 divizori,  13 are 2 divizori, 12 și 20 au același număr de divizori. Așadar ordinea va fi 100 12 20 4 13.

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1608)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1608/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1608/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
