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
2414 - 2lap
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 citesc două numere naturale '''N''' și '''M''' și apoi, de pe următoarea linie, numere naturale de forma 2p, separate prin câte un spațiu. Să se afișeze: 1. care sunt valorile ce ar apărea pe pozițiile N și M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului, separate printr-un spațiu; 2. puterea la care apare 2 în descompunerea în factori primi a produsului tuturor numerelor care ar fi situate între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare; 3. toate numerele distincte, afișate în ordine crescătoare, care ar apărea între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător, obținut din valorile citite de pe a doua linie a fișierului de intrare. == Date de intrare == Fișierul de intrare '''2lap.in''' conține pe prima linie numărul N și M despărțite printr-un spațiu, iar pe a doua linie numere naturale de forma '''2^p''', separate de asemenea prin spații. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." Fișierul de ieșire '''2lap.out''' va conține pe prima linie numerele K1 și K2 reprezentând numerele care ar apărea pe pozițiile N, respectiv M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare, separate printr-un spațiu, pe a doua linie a fișierului un singur număr K reprezentând puterea la care apare 2 în descompunerea în factori primi a produsului cerut, iar pe a treia linie a fișierului de ieșire, valorile cerute, de asemenea separate printr-un spațiu. Î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 < M ≤ 30000 *0 ≤ p ≤ 30 *șirul nu are mai puțin de M termeni *N + 1 < M == Exemple == ===Exemplul 1=== ; ''2lap.in'' :5 8 :16 32 2 64 256 128 32 128 32 128 ; ''ecran'' :Datele sunt introduse corect. ; ''2lap.out'' :32 128 :14 :64 128 ===Exemplul 2=== ; ''2lap.in'' :3 7 :8 16 32 64 128 256 51 ; ''ecran'' :Datele sunt introduse corect. ; ''2lap.out'' :32 512 :24 :64 128 256 512 ===Exemplul 3=== ; ''2lap.in'' :10 5 :2 4 8 16 32 64 ; ''ecran'' :Datele nu corespund restricțiilor impuse. ; ''2lap.out'' : <br> == Rezolvare == <syntaxhighlight lang="python" line="1"> # 2414 - 2lap def validare_date(n, m, nums): if not (1 <= n < m <= 30000): print("Datele nu corespund restricțiilor impuse.") return False for x in nums: if not (0 <= x <= 2**30 and x & (x-1) == 0): print("Datele nu corespund restricțiilor impuse.") return False print("Datele sunt introduse corect.") return True def rezolvare(n, m, nums): nums.sort() if n >= m or n + 1 > len(nums) or m > len(nums): return k1, k2 = nums[n-1], nums[m-1] produs = 1 for i in range(n + 1, m): produs *= nums[i] putere_minima = produs.bit_length() nums_set = set(nums[n:m]) rezultat = f"{k1} {k2}\n{putere_minima - 1}\n{' '.join(str(x) for x in sorted(nums_set))}\n" return rezultat if __name__ == "__main__": with open("2lap.in", "r") as f: n, m = map(int, f.readline().split()) nums = list(map(int, f.readline().split())) if validare_date(n, m, nums): with open("2lap.out", "w") as g: g.write(rezolvare(n, m, nums)) else: print("Nu s-au putut rezolva problemele din cauza datelor invalide.") </syntaxhighlight> ==Explicatie== 1. validare Această funcție are rolul de a verifica dacă datele de intrare respectă restricțiile impuse de cerință. Dacă valorile introduse sunt corecte, funcția returnează True, altfel returnează False. Funcția începe prin a deschide fișierul de intrare 2lap.in și a citi valorile N și M de pe prima linie. Apoi, verifică dacă N și M sunt numere naturale distincte și dacă acestea respectă restricțiile impuse de cerință, adică 1 ≤ N < M ≤ 30000. Dacă valorile nu respectă aceste condiții, funcția returnează False. În caz contrar, funcția returnează True, semn că datele de intrare sunt valide și programul poate continua cu următoarea etapă. 2. rezolvare Această funcție primește datele de intrare (valide, după cum se presupune) și are rolul de a găsi soluția cerută și de a o scrie în fișierul de ieșire 2lap.out. Funcția începe prin a citi lista de numere de pe a doua linie a fișierului de intrare și a determina valorile k1 și k2 care apar pe pozițiile N și M din lista ordonată crescător a numerelor citite. După ce găsește valorile k1 și k2, funcția calculează puterea minimă la care apare numărul 2 în produsul numerelor de la poziția N+1 la poziția M-1 inclusiv. Aceasta se face prin calculul produsului tuturor numerelor din lista de la poziția N+1 la poziția M-1, iar apoi divizând repetat produsul la 2 până când produsul nu mai poate fi divizat. Numărul de divizări la 2 corespunde puterii la care apare numărul 2 în produs. În final, funcția afișează toate numerele distincte din lista inițială care se află între pozițiile N și M, excludând valorile k1 și k2. Valorile sunt sortate crescător și separate prin spații. 3. main Această funcție este punctul de intrare în program. Funcția începe prin a apela funcția validare pentru a verifica datele de intrare. Dacă datele sunt valide, funcția rezolvare este apelată pentru a găsi soluția cerută și a o scrie în fișierul de ieșire. Dacă datele nu sunt valide, programul afișează un mesaj corespunzător.
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