3408 - joc2020

From Bitnami MediaWiki

Sursa: - joc2020


Cerinţa[edit | edit source]

Gigel a descoperit un nou joc. Jocul are n nivele și la fiecare nivel îți dă câte un număr natural x. Pentru a trece nivelul trebuie să calculezi câți divizori are numărul x. Scrieți un program care să permită terminarea jocului prin trecerea celor n nivele în ordinea în care sunt date.

Date de intrare[edit | edit source]

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

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieșire joc2020.out va conține pe prima linie n numere, fiecare reprezentând numărul de divizori ai numărului corespunzător din fişierul de intrare. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • 1 ≤ n ≤ 500.000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

joc2020.in
7
30 5 44 210 1 35 30030
Ieșire
Datele sunt corecte.
joc2020.out
8 2 6 16 1 4 64

Exemplul 2[edit | edit source]

joc2020.in
3
27 11 8
Ieșire
Datele sunt corecte.
joc2020.out
4 2 4

Exemplul 3[edit | edit source]

joc2020.in
2
191824719471 19991
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3408

def joc2020(vector, n):

   f = open("joc2020.out", "w")
   for numar in vector:
       divizori = 0
       for div in range(1, numar+1):
           if numar % div == 0:
               divizori += 1
       f.write(str(divizori)+ " ")
       
       

def conform_restrictiilor():

   vector = list()
   with open('joc2020.in') as f:
       n = int(f.readline())
       vector = list(map(int, f.readline().split()))
   if n > 500000 or n < 1:
       print("Datele nu sunt comform restricțiilor impuse.")
       exit()
   for x in vector:
       if x < 0 or x > 1000000:
           print("Datele nu sunt comform restricțiilor impuse.")
           exit()
   print("Datele sunt corecte.")
   return vector, n


if __name__ == '__main__':

   vector, n = conform_restrictiilor()
   joc2020(vector, n)

</syntaxhighlight>

Explicaţie cod[edit | edit source]

Acest program primește un fișier de intrare joc2020.in care conține un număr natural n și o listă de n numere naturale. Scopul programului este de a calcula numărul de divizori pentru fiecare număr din lista de intrare și a scrie numărul de divizori într-un fișier de ieșire joc2020.out.

Funcția joc2020 primește ca parametrii vectorul de numere și numărul de elemente din vector. Ea deschide fișierul de ieșire, apoi parcurge fiecare număr din vector. Pentru fiecare număr, calculează numărul de divizori prin parcurgerea tuturor numerelor de la 1 la numărul respectiv și verificarea dacă acesta este divizor. Numărul de divizori este stocat într-o variabilă numită divizori. Funcția apoi scrie numărul de divizori în fișierul de ieșire și adaugă un spațiu la sfârșit pentru a separa numerele.

Funcția conform_restrictiilor citește datele de intrare din fișierul joc2020.in și verifică dacă acestea sunt conforme cu restricțiile impuse. Dacă n depășește 500.000 sau este mai mic decât 1 sau dacă cel puțin unul dintre numerele din vector este mai mic decât 0 sau mai mare decât 1.000.000, programul afișează "Datele nu sunt comform restricțiilor impuse." și se încheie.

Funcția main apelează funcția conform_restrictiilor pentru a verifica datele de intrare și pentru a obține vectorul și numărul de elemente. Apoi apelează funcția joc2020 pentru a scrie numărul de divizori în fișierul de ieșire.