2714 - Frecv Imp: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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 '''frecvimp.in''' 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 '''frecvimp.out''' va co...
 
 
(6 intermediate revisions by 2 users not shown)
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 les; 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 = 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
; frecvimpout.txt
Datele de intrare corespund restrictiilor impuse
512
<br>
<br>
== Exemplul 2 ==
; frecvimpin.txt
-1
22 77 99 11
; frecvimp.out
; frecvimp.out
: 512
Datele de intrare nu corespund restrictiilor impuse
<br>
 
== 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>

Latest revision as of 18:07, 15 November 2023

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>

  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>