👤
Feherdarius
a fost răspuns

Am gresit ceva la acest algoritm , daca da , ce?
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

Codul:


Am Gresit Ceva La Acest Algoritm Daca Da Ce Cerința Se Dau N Numere Naturale Nenule Ordonați Descrescător Cele N Numere După Numărul Lor De Divizori Date De Int class=

Răspuns :

Salut,
Partea din cod care pune probleme este cea in care faci sortarea in mod descrescator. Faci inversiunea dintre 2 elemente pentru valorile numerelor, dar nu faci inversiunea si pentru numarul de divizori.

Un exemplu simplu
Sa zicem ca ai datele de intrare
6
12 32 19 43 14 21
Aceste numere au numarul de divizori
6 6 2 2 4 4
Pana la pozitia a treia nu se intampla nimic, pentru ca deja sunt descrescator
la a treia pozitie, compara 2 cu 2, sunt acelasi, dar 19<43, deci nu se face inversiunea
compara apoi 2 cu 4, 2<4 atunci se face inversiunea DOAR de numere, deci sirul devine 12 32 14 43 19 21 dar sirul cu numarul de divizori ramane 6 6 2 2 4 4. Apoi face comparatia cu urmatorul numar: 2 fata de 4. 2 este mai mic fata de 4, atunci se face inversiunea, si avem
12 32 21 43 19 14
Din acest moment, 14 va aparea dupa 21, si algoritmul da gres.
Deci tot ce trebuie sa faci este sa faci schimbarea de elemente si in vectorul a

   for(i=1; i<b; i++)
        for(j=i+1; j<=b; j++)
            if((a[i]<a[j] ) || (a[i]==a[j] && v[i]>v[j]))
            {
                aux=v[i];
                v[i]=v[j];
                v[j]=aux;

                aux=a[i];
                a[i]=a[j];
                a[j]=aux;
            }