Rezolvare completă PbInfo #1608 Sortare Divizori

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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Sortare Divizori:

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

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1608 Sortare Divizori

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1608 Sortare Divizori de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!