Informatică, întrebare adresată de CiortescuMihai7, 9 ani în urmă

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ăspunsuri la întrebare

Răspuns de stassahul
4
#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;
}

stassahul: Este necesar sa rezolvi prin metoda bulelor, in caz contrar limita depasita. Daca nuti place algoritmul pentru aflarea numarul de divizori, il foloseste pe acel din solutia oficiala.
Alte întrebări interesante