3218 - nrdiv1: Difference between revisions

From Bitnami MediaWiki
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...
 
No edit summary
 
Line 46: Line 46:
<syntaxhighlight lang="python" line="1">
<syntaxhighlight lang="python" line="1">
# 3218 - nrdiv1
# 3218 - nrdiv1
def este_input_valid(sir_input):
def numara_divizori(x):
     """Verifică dacă șirul de intrare este valid pentru N."""
     """Numără divizorii numărului dat."""
     try:
     cnt_divizori = 0
        n = int(sir_input.strip())
    for d in range(1, int(x ** 0.5) + 1):
         if not 1 <= n <= 50:
         if x % d == 0:
             return False
             cnt_divizori += 2
        return True
    # Dacă x este un pătrat perfect, trebuie scăzut un divizor
     except ValueError:
     if int(x ** 0.5) ** 2 == x:
         return False
         cnt_divizori -= 1
    return cnt_divizori




def este_nr_valid(sir_input):
def valideaza_input(sir_input, n=None):
     """Verifică dacă șirul de intrare este un număr natural valid."""
     """Verifică dacă șirul de intrare este valid."""
     try:
     try:
         x = int(sir_input.strip())
         x = int(sir_input.strip())
         if not 1 <= x <= 10**13:
         if n is not None:
             return False
            if not 1 <= x <= 10**13:
                print("Datele nu corespund restricțiilor impuse.")
                return False
        else:
             if not 1 <= x <= 50:
                print("Datele nu corespund restricțiilor impuse.")
                return False
        if n is None:
            print("Datele sunt introduse corect.")
         return True
         return True
     except ValueError:
     except ValueError:
        print("Datele nu corespund restricțiilor impuse.")
         return False
         return False




def main():
if __name__ == "__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:
     with open("nrdiv.in", "r") as f, open("nrdiv.out", "w") as w:
         # Verificăm dacă N este un număr natural valid
         # Verificăm dacă N este un număr natural valid
         sir_input = f.readline()
         sir_input = f.readline()
         if not este_input_valid(sir_input):
         if not valideaza_input(sir_input):
            print("Datele nu corespund restricțiilor impuse.")
             exit(0)
             exit(0)
         n = int(sir_input)
         n = int(sir_input)
Line 81: Line 89:
         for i in range(n):
         for i in range(n):
             sir_input = f.readline()
             sir_input = f.readline()
             if not este_nr_valid(sir_input):
             if not valideaza_input(sir_input, n=i):
                print("Datele nu corespund restricțiilor impuse.")
                 exit(0)
                 exit(0)
             x = int(sir_input)
             x = int(sir_input)
             cnt_divizori = 0
             cnt_divizori = numara_divizori(x)
            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")
             w.write(str(cnt_divizori) + "\n")


        print("Datele sunt introduse corect.")




Line 104: Line 104:




</syntaxhighlight>




==Explicatie==
Funcția este_input_valid(sir_input) primește un șir de caractere sir_input și verifică dacă acesta poate fi convertit la un număr întreg valid, care trebuie să fie un număr natural între 1 și 50. Dacă sir_input nu poate fi convertit într-un număr întreg valid sau nu se încadrează în intervalul specificat, funcția afișează un mesaj de eroare și returnează False. Altfel, funcția returnează True.


'''Explicatie'''
Funcția este_nr_valid(sir_input) primește un șir de caractere sir_input și verifică dacă acesta poate fi convertit la un număr întreg valid, care trebuie să fie un număr natural între 1 și 10^13. Dacă sir_input nu poate fi convertit într-un număr întreg valid sau nu se încadrează în intervalul specificat, funcția afișează un mesaj de eroare și returnează False. Altfel, funcția returnează True.
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.


Funcția numara_divizori(x) primește un număr întreg x și numără divizorii acestuia. Pentru a număra divizorii, funcția parcurge toți divizorii numărului din intervalul [1, sqrt(x)], incrementând contorul cu 2 pentru fiecare divizor găsit (deoarece divizorii apar întotdeauna în perechi, cu excepția cazului în care x este un pătrat perfect). Dacă x este un pătrat perfect, se scade 1 din contorul de divizori (deoarece divizorul dublu se numără o singură dată).


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ă. În funcția main(), se deschide fișierul de intrare în modul citire și fișierul de ieșire în modul scriere. Se citesc și se validează datele de intrare, apoi se calculează numărul de divizori pentru fiecare număr din secvență, folosind funcția numara_divizori(). Rezultatul este scris în fișierul de ieșire, iar mesajul "Datele sunt introduse corect." este afișat în consolă (doar în cazul în care nu se validează un număr din secvență).


 
În general, 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>

Latest revision as of 05:04, 2 April 2023

Cerința[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

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

Exemplul 2[edit | edit source]

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

Exemplul 3[edit | edit source]

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



Rezolvare[edit | edit source]

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

  1. 3218 - nrdiv1

def numara_divizori(x):

   """Numără divizorii numărului dat."""
   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
   return cnt_divizori


def valideaza_input(sir_input, n=None):

   """Verifică dacă șirul de intrare este valid."""
   try:
       x = int(sir_input.strip())
       if n is not None:
           if not 1 <= x <= 10**13:
               print("Datele nu corespund restricțiilor impuse.")
               return False
       else:
           if not 1 <= x <= 50:
               print("Datele nu corespund restricțiilor impuse.")
               return False
       if n is None:
           print("Datele sunt introduse corect.")
       return True
   except ValueError:
       print("Datele nu corespund restricțiilor impuse.")
       return False


if __name__ == "__main__":

   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 valideaza_input(sir_input):
           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 valideaza_input(sir_input, n=i):
               exit(0)
           x = int(sir_input)
           cnt_divizori = numara_divizori(x)
           w.write(str(cnt_divizori) + "\n")


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

main()



</syntaxhighlight>


Explicatie[edit | edit source]

Funcția este_input_valid(sir_input) primește un șir de caractere sir_input și verifică dacă acesta poate fi convertit la un număr întreg valid, care trebuie să fie un număr natural între 1 și 50. Dacă sir_input nu poate fi convertit într-un număr întreg valid sau nu se încadrează în intervalul specificat, funcția afișează un mesaj de eroare și returnează False. Altfel, funcția returnează True.

Funcția este_nr_valid(sir_input) primește un șir de caractere sir_input și verifică dacă acesta poate fi convertit la un număr întreg valid, care trebuie să fie un număr natural între 1 și 10^13. Dacă sir_input nu poate fi convertit într-un număr întreg valid sau nu se încadrează în intervalul specificat, funcția afișează un mesaj de eroare și returnează False. Altfel, funcția returnează True.

Funcția numara_divizori(x) primește un număr întreg x și numără divizorii acestuia. Pentru a număra divizorii, funcția parcurge toți divizorii numărului din intervalul [1, sqrt(x)], incrementând contorul cu 2 pentru fiecare divizor găsit (deoarece divizorii apar întotdeauna în perechi, cu excepția cazului în care x este un pătrat perfect). Dacă x este un pătrat perfect, se scade 1 din contorul de divizori (deoarece divizorul dublu se numără o singură dată).

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ă. În funcția main(), se deschide fișierul de intrare în modul citire și fișierul de ieșire în modul scriere. Se citesc și se validează datele de intrare, apoi se calculează numărul de divizori pentru fiecare număr din secvență, folosind funcția numara_divizori(). Rezultatul este scris în fișierul de ieșire, iar mesajul "Datele sunt introduse corect." este afișat în consolă (doar în cazul în care nu se validează un număr din secvență).

În general, 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.