3218 - nrdiv1

From Bitnami MediaWiki
Revision as of 17:53, 30 March 2023 by Sovago Rares-Andrei (talk | contribs) (Pagină nouă: == Cerința == Se consideră o secvență de '''N''' numere naturale nenule.Determinați numărul de divizori pentru fiecare număr din secvența dată. == Date de intrare == Fișierul de intrare '''nrdiv.in''' conține pe prima linie numărul natural N, care reprezintă numărul de valori din secvență. Pe următoarele '''N''' linii se află cele '''N''' numere naturale din secvență, câte un număr pe o linie. == Date de ieșire == Dacă datele sunt introduse corect, pe...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

Se consideră o secvență de N numere naturale nenule.Determinați numărul de divizori pentru fiecare număr din secvența dată.

Date de intrare

Fișierul de intrare nrdiv.in conține pe prima linie numărul natural N, care reprezintă numărul de valori din secvență. Pe următoarele N linii se află cele N numere naturale din secvență, câte un număr pe o linie.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.", fișierul de ieșire nrdiv.out va conține N linii. Pe linia i va fi scris numărul de divizori ai celui de-al i-lea număr din secvență (considerând ordinea din fișierul de intrare). În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 1 ≤ N ≤ 50
  • 1 ≤ numerele din secvență ≤ 10^13

Exemple

Exemplul 1

nrdiv.in
3
13
1
24
ecran
Datele sunt introduse corect.
nrdiv.out
2
1
8

Exemplul 2

nrdiv.in
3
12
23
30
ecran
Datele sunt introduse corect.
nrdiv.out
6
2
8

Exemplul 3

nrdiv.in
-5
ecran
Datele nu corespund restricțiilor impuse.



Rezolvare

<syntaxhighlight lang="python" line="1">

  1. 3218 - nrdiv1

def este_input_valid(sir_input):

   """Verifică dacă șirul de intrare este valid pentru N."""
   try:
       n = int(sir_input.strip())
       if not 1 <= n <= 50:
           return False
       return True
   except ValueError:
       return False


def este_nr_valid(sir_input):

   """Verifică dacă șirul de intrare este un număr natural valid."""
   try:
       x = int(sir_input.strip())
       if not 1 <= x <= 10**13:
           return False
       return True
   except ValueError:
       return False


def main():

   """Funcția principală care validează datele de intrare și calculează numărul de divizori."""
   with open("nrdiv.in", "r") as f, open("nrdiv.out", "w") as w:
       # Verificăm dacă N este un număr natural valid
       sir_input = f.readline()
       if not este_input_valid(sir_input):
           print("Datele nu corespund restricțiilor impuse.")
           exit(0)
       n = int(sir_input)
       # Pentru fiecare număr din secvență, calculăm numărul de divizori și îl scriem în fișierul de ieșire
       for i in range(n):
           sir_input = f.readline()
           if not este_nr_valid(sir_input):
               print("Datele nu corespund restricțiilor impuse.")
               exit(0)
           x = int(sir_input)
           cnt_divizori = 0
           for d in range(1, int(x ** 0.5) + 1):
               if x % d == 0:
                   cnt_divizori += 2
           # Dacă x este un pătrat perfect, trebuie scăzut un divizor
           if int(x ** 0.5) ** 2 == x:
               cnt_divizori -= 1
           w.write(str(cnt_divizori) + "\n")
       print("Datele sunt introduse corect.")


  1. Apelăm funcția principală pentru a rula programul.

main()





Explicatie Funcția este_input_valid primește un șir de caractere și verifică dacă acesta poate fi convertit la un număr natural între 1 și 50. În cazul în care poate fi convertit, returnează True, altfel returnează False.

Funcția este_nr_valid primește un șir de caractere și verifică dacă acesta poate fi convertit la un număr natural mai mic sau egal cu 10^13. În cazul în care poate fi convertit, returnează True, altfel returnează False.

Funcția main este funcția principală care se ocupă de citirea datelor din fișierul de intrare, de validarea acestora și de calculul numărului de divizori pentru fiecare număr din secvența dată.

Mai întâi se deschide fișierul de intrare în modul citire și fișierul de ieșire în modul scriere.

Se citește prima linie din fișierul de intrare, care reprezintă numărul de elemente din secvență și se validează folosind funcția este_input_valid.

Pentru fiecare element din secvență se citesc valorile și se validează folosind funcția este_nr_valid.

Se calculează numărul de divizori ai fiecărui element din secvență, parcurgând toți divizorii din intervalul [1, sqrt(x)]. Dacă x este un pătrat perfect, trebuie scăzut un divizor.

Rezultatul este scris în fișierul de ieșire, iar mesajul "Datele sunt introduse corect." este afișat în consolă.

Astfel, codul verifică fiecare număr din secvență și calculează numărul de divizori ai acestora, scriind rezultatul în fișierul de ieșire. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj corespunzător în consolă și se încheie programul.




</syntaxhighlight>