👤

Cerința ---> #1608 Sortare Divizori pbinfo (va rog ajutor am nevoie de 100 pct. C++)

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.


Răspuns :

#include <bits/stdc++.h>

using namespace std;

ifstream fin("sortare_divizori.in");
ofstream fout("sortare_divizori.out");

int n,a[1001],b[1001];

unsigned long Count(unsigned long a);

int main()
{

    fin >> n;

    for(int i=1;i<=n;i++)
    {
        fin >> a[i];
        b[i]=Count(a[i]);
    }

    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
        {
            if(b[i]<b[j])
            {
                swap(b[i],b[j]);
                swap(a[i],a[j]);
            }
            else if(b[i]==b[j])
                if(a[i]>a[j])
                    swap(a[i],a[j]);
        }

    for(int i=1;i<=n;i++)
        cout << a[i] << " ";

    return 0;
}

unsigned long Count(unsigned long a)
{
   unsigned long count = 1, k = 0, i;
   if (a == 1 || a == 2)
      return a;
   while ((a & 1) == 0)
   {
      k++;
      a >>= 1;
   }
   if (a == 1)
      return k + 1;
   else
      count = k + 1;
   for(i = 3; i*i <= a; i += 2)
   {
      k = 0;
      while(a % i == 0)
      {
         k++;
         a /= i;
      }
      count *= (k + 1);
   }
   if (a > 1)
      count <<= 1;
   return count;
}