2714 - Frecv Imp: Difference between revisions

From Bitnami MediaWiki
mNo edit summary
No edit summary
Line 2: Line 2:
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ă.
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 ==
== Date de intrare ==
Fișierul de intrare '''frecvimp.in''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale separate prin spații.
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 ==
== Date de ieşire ==
Fișierul de ieșire '''frecvimp.out''' 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ă.
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 ==
== Restricții și precizări ==
* 1 ⩽ n ⩽ 1.000.000
* 1 ⩽ n ⩽ 1.000.000
* numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât <math> 9223372036854775807 </math>
* numerele de pe a doua linie a fișierului de intrare sunt naturale, nenule și mai mici decât <math> 9223372036854775807 </math>
* <math> 9223372036854775807 </math> = 2 <sup> 63 </sup> - 1
* <math> 9223372036854775807 </math> = 2 <sup> 63 </sup> - 1
== Exemplu ==
== Exemplul 1 ==
; frecvimp.in
; frecvimpin.txt
: 10
: 10
: 41 235 64 41 512 64 1488 512 361 512
: 41 235 64 41 512 64 1488 512 361 512
<br>
; frecvimpout.txt
: Datele de intrare corespund restrictiilor impuse
: 512
== Exemplul 2 ==
; frecvimpin.txt
: -1
: 22 77 99 11
; frecvimp.out
; frecvimp.out
: 512
: Datele de intrare nu corespund restrictiilor impuse
== Explicație ==
== Explicație ==
În fișierul de intrare sunt '''2''' puteri ale lui 2, '''64''' și '''512''', dintre care '''512''' apare de '''3''' ori.
În fișierul de intrare sunt '''2''' puteri ale lui 2, '''64''' și '''512''', dintre care '''512''' apare de '''3''' ori.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Definim funcția
# 2714  Frecv Imp
def FrecvImp(n):
def validare(n_validare, numere_validare):
     # Inițializăm un dicționar gol
     # Verificăm dacă n este în intervalul 1-1000000
     frec = {}
     if n_validare < 1 or n_validare > 1000000:
     # Parcurgem lista de numere
        raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 1-1000000
     for n in n:
     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
         # Dacă numărul nu se află încă în dicționar, îl adăugăm cu frecvența 0
         if n not in frec:
         if numar not in frec:
             frec[n] = 0
             frec[numar] = 0
         # Incrementăm frecvența numărului curent
         frec[numar] += 1    # Incrementăm frecvența numărului curent
         frec[n] += 1
 
    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


    # Parcurgem dicționarul
    for n in frec:
        # Verificăm dacă frecvența numărului curent este impară și dacă numărul este o putere a lui 2
        if frec[n] % 2 == 1 and (n & (n - 1) == 0):
            # Dacă găsim un astfel de număr îl returnăm
            return n


# Deschidem fișierul de intrare și citim datele
if __name__ == '__main__':
with open('frecvimp.in', 'r') as intrare:
     file_in = open("frecvimpin.txt", "r")   # Deschidem fișierul de intrare pentru citire
     n = int(intrare.readline())
     file_out = open("frecvimpout.txt", "w")   # Deschidem fișierul de ieșire pentru scriere
    # Citim a doua linie, o împărțim în cuvinte separate prin spații și convertim fiecare cuvânt la int
     numere = list(map(int, intrare.readline().split()))


# Apelăm funcția
    try:
result = FrecvImp(numere)
        # 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')


# Deschidem fișierul de ieșire și scriem rezultatul
    except ValueError:
with open('frecvimp.out', 'w') as iesire:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    iesire.write(str(result))
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

Revision as of 12:48, 10 November 2023

Cerinţa

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

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

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

  • 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

frecvimpin.txt
10
41 235 64 41 512 64 1488 512 361 512
frecvimpout.txt
Datele de intrare corespund restrictiilor impuse
512

Exemplul 2

frecvimpin.txt
-1
22 77 99 11
frecvimp.out
Datele de intrare nu corespund restrictiilor impuse

Explicație

În fișierul de intrare sunt 2 puteri ale lui 2, 64 și 512, dintre care 512 apare de 3 ori.

Rezolvare

<syntaxhighlight lang="python" line>

  1. 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>