Rezolvare completă PbInfo #3481 sort_div

Cerința

Se dau n numere naturale. Să se afișeze acestea în ordinea crescătoare a numărului de divizori ai fiecăruia, la același număr de divizori crescător după cifra de control, la aceeași cifră de control crescător după prima cifră, iar dacă și prima cifră este aceeași atunci numerele se vor afișa în ordinea crescătoare a valorii lor.

Date de intrare

Fișierul de intrare sort_div.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieșire

Fișierul de ieșire sort_div.out va conține pe prima linie cele n numere separate prin câte un spațiu, ordonate crescător pe baza criteriilor din enunț.

Restricții și precizări

  • 1 ≤ n ≤ 10000
  • numerele de pe a doua linie a fișierului de intrare vor fi distincte și mai mici decât 1.000.000
  • cifra de control a unui număr se obţine efectuând suma cifrelor sale, apoi suma cifrelor acestei sume etc. până se obţine o sumă formată dintr-o singură cifră. De exemplu, cifra de control a numărului 645 este 6. (6+4+5=15, 1+5=6)

Exemplu

sort_div.in

5
6 8 3 10 5

sort_div.out

3 5 10 6 8

Explicație

3 și 5 au ambele 2 divizori, deci se afișează în ordine crescătoare după cifra de control. La fel și 6, 8 și 10 care au fiecare câte 4 divizori.

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 sort_div:

#include <bits/stdc++.h>
using namespace std;

ifstream f("sort_div.in");
ofstream g("sort_div.out");

int prima(int x)
{
    while (x > 9) x /= 10;
    return x;
}

int NrDiv(int x)
{
    int P = 1, d = 2, p;
    while (x > 1)
    {
        p = 0;
        while (x % d == 0)
        {
            x /= d;
            p++;
        }
        P *= (p + 1);
        if (d == 2) d = 3;
        else d += 2;
        if (d * d > x && x > 1) d = x;
    }
    return P;
}

struct nr
{
    int val, div, con, cif;
}
v[16384];

bool fcmp(nr a, nr b)
{
    if (a.div < b.div) return true;
    else if (a.div == b.div && a.con < b.con) return true;
    else if (a.div == b.div && a.con == b.con && a.cif < b.cif) return true;
    else if (a.div == b.div && a.con == b.con && a.cif == b.cif && a.val < b.val) return true;
    else return false;
}

int n, i;
int main()
{
    f >> n;
    for (i = 1; i <= n; i++)
    {
        f >> v[i].val;
        v[i].div = NrDiv(v[i].val);
        v[i].con = v[i].val % 9;
        if(v[i].con == 0) v[i].con = 9;
        v[i].cif = prima(v[i].val);
    }
    sort(v + 1, v + n + 1, fcmp);
    for (i = 1; i <= n; i++) g << v[i].val << " ";
    f.close();
    g.close();
    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 #3481 sort_div

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3481 sort_div 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!