2714 - Frecv Imp
Cerinţa[edit | edit source]
Se dă un șir format din n numere naturale. Toate valorile putere a lui 2 din acest șir au frecvență pară, cu o singură excepție. Determinați această valoare – putere a lui 2 cu frecvență impară.
Date de intrare[edit | edit source]
Fișierul de intrare frecvimpin.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Date de ieşire[edit | edit source]
Fișierul de ieșire frecvimpout.txt va conține pe prima linie numărul p, reprezentând singura valoare din șirul dat care este putere a lui 2 și are frecvență impară.
Restricții și precizări[edit | edit source]
- 1 ⩽ n ⩽ 1.000.000
- numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât
- = 2 63 - 1
Exemplul 1[edit | edit source]
- frecvimpin.txt
10 41 235 64 41 512 64 1488 512 361 512
- frecvimpout.txt
Datele de intrare corespund restrictiilor impuse 512
Exemplul 2[edit | edit source]
- frecvimpin.txt
-1 22 77 99 11
- frecvimp.out
Datele de intrare nu corespund restrictiilor impuse
Explicație[edit | edit source]
În fișierul de intrare sunt 2 puteri ale lui 2, 64 și 512, dintre care 512 apare de 3 ori.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2714 Frecv Imp
def validare(n_validare, numere_validare):
# Verificăm dacă n este în intervalul 1-1000000 if n_validare < 1 or n_validare > 1000000: raise ValueError # Ridicăm o eroare dacă n nu este în intervalul 1-1000000 for numar in numere_validare: # Parcurgem lista de numere if numar < 1 or numar > 9223372036854775807: # Ridicăm o eroare dacă numărul nu este în intervalul 1-9223372036854775807 raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def frecvimp(numere):
frec = {} # Inițializăm un dicționar gol for numar in numere: # Parcurgem lista de numere # Dacă numărul nu se află încă în dicționar, îl adăugăm cu frecvența 0 if numar not in frec: frec[numar] = 0 frec[numar] += 1 # Incrementăm frecvența numărului curent
for numar in frec: # Parcurgem dicționarul # Dacă frecvența numărului curent este impară și dacă numărul este o putere a lui 2 if frec[numar] % 2 == 1 and (numar & (numar - 1) == 0): return numar # Dacă găsim un astfel de număr îl returnăm
if __name__ == '__main__':
file_in = open("frecvimpin.txt", "r") # Deschidem fișierul de intrare pentru citire file_out = open("frecvimpout.txt", "w") # Deschidem fișierul de ieșire pentru scriere
try: # Citim numărul de numere n_main = int(file_in.readline()) # Citim numerele numere_main = list(map(int, file_in.readline().split())) validare(n_main, numere_main) # Validăm datele de intrare # Calculăm și scriem numărul cu frecvență impară rezultat_main = frecvimp(numere_main) file_out.write(str(rezultat_main) + '\n')
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>