1608 - Sortare Divizori

From Bitnami MediaWiki
Revision as of 11:10, 25 October 2023 by Tita Marian (talk | contribs) (Pagină nouă: == 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 de...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 ⩽ 1.000
  • 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 1

sortare_divizori.in
5
12 20 4 100 13
sortare_divizori.out
100 12 20 4 13


Rezolvare

<syntaxhighlight lang="python" line>

def numar_divizori(numar):
   divizori = 0
   for i in range(1, numar + 1):
       if numar % i == 0:
           divizori += 1
   return divizori

if __name__ == "__main__":

   # Citim numărul n și lista de numere din fișierul de intrare
   with open("sortare_divizori.in", "r") as f:
       n = int(f.readline().strip())
       numere = list(map(int, f.readline().strip().split()))
   # Verificăm restricțiile impuse pentru numere
   numere = [numar for numar in numere if numar < 1000000000]
   # Calculăm numărul de divizori pentru fiecare număr și sortăm numerele în ordine descrescătoare după numărul de divizori,
   # iar în caz de egalitate, sortăm crescător
   numere.sort(key=lambda x: (numar_divizori(x), -x), reverse=True)
   # Scriem rezultatul în fișierul de ieșire
   with open("sortare_divizori.out", "w") as f:
       for numar in numere:
           f.write(str(numar) + " ")

</syntaxhighlight>

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.