Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
3218 - nrdiv1
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
== 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. <br> == Rezolvare == <syntaxhighlight lang="python" line="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") # Apelăm funcția principală pentru a rula programul. main() </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. 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.
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width