Informatică, întrebare adresată de DC2002, 8 ani în urmă

Se da un sir de numere intregi. Numerele trebuie ordonate crescător în funcţie de cea mai mică cifră; dacă numerele au aceeaşi cea mai mică cifră, atunci ele vor trebui ordonate crescător în funcţie de cea mai mare cifră; dacă numerele au aceeaşi cea mai mică şi cea mai mare cifră, atunci ele trebuie ordonate crescător.

Date de intrare
Intrarea constă într-o secvenţă de numere întregi, fără semn, necunoscut de lungă

Date de ieșire
La ieşire, se vor afişa numerele sortate după metoda prezentată mai sus, separate prin whitespace.

Exemplu
Intrare:
62 178 789 61372 7451 79 6

Ieşire:
7451 61372 178 62 6 79 789

Explicaţie:
Cea mai mică cifră din toate numerele este 1. Această cifră se află în 3 din cele 7 numere (178, 61372 şi 7451), deci aceste numere trebuie să fie la începutul vectorului. Dintre acestea, 7451 şi 61372 au cifra maximă 7, iar 178 are cifra maximă 8. Deoarece 7451 şi 61372 au cifra maximă şi minimă egale, ele trebuie aranjate crescător (întâi 7451, apoi 61372). Numărul 178 trebuie să se afle după cele 2 numere deoarece are cifra maximă mai mare decât a celorlalte două. Următorul număr trebuie să fie 62 deoarece are cea mai mică cifră 2. Apoi urmează 6. Numerele 79 şi 789 au cea mai mică cifră 7 şi cea mai mare cifră 9, deci ele trebuie puse după numărul 6 şi în ordine crescătoare.

Răspunsuri la întrebare

Răspuns de Sergetec
3

Salut!

Ai rezolvarea in C++ mai jos

#include <iostream>

#include <algorithm>

using namespace std;

struct nr {

   int val;

   int mini;

   int maxi;

};

nr a[10001];

bool cmp(nr x, nr y) {

   if (x.mini == y.mini) {

       if (x.maxi == y.maxi) {

           return x.val < y.val;

       }

       else {

           return x.maxi < y.maxi;

       }

   }

   else {

       return x.mini < y.mini;

   }

}

int main() {

   int n;

   cin >> n;

   for (int i = 1; i <= n; ++i) {

       cin >> a[i].val;

       int ca = a[i].val;

       int minii = 10, maxii = -1;

       while (ca != 0) {

           if (ca % 10 < minii) {

               minii = ca % 10;

           }

           if (ca % 10 > maxii) {

               maxii = ca % 10;

           }

           ca /= 10;

       }

       a[i].mini = minii;

       a[i].maxi = maxii;

   }

   sort(a + 1, a + n + 1, cmp);

   for (int i = 1; i <= n; ++i) {

       cout << a[i].val << " ";

   }

   return 0;

}

Explicatie:

  • Ne folosim de ajutorul librariei algorithm care ne ofera acces la functia sort()
  • Functia sort() ne poate sorta un vector dupa anumite criterii specificate
  • Folosim struct pentru a ne declara o structura de numar, aceasta va contine valoarea in sine a acelui numar, cifra minima si cifra maxima (necesare pentru sortare)
  • Vom avea o functie de tip boolean in care vom avea cerintele de sortare, iar pentru usurinta o vom lua in sens invers si anume:

daca numerele au aceeasi cifra minima si maxima, atunci se sorteaza crescator dupa val, altfel se sorteaza dupa cifra maxima, altfel se sorteaza dupa cifra minima

  • Restul este doar cod pentru aflarea cifrei minime si maxime a fiecarui numar citit, cat si afisarea vectorului sortat
Alte întrebări interesante