0269 - Puteri K

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dau n numere naturale şi un număr natural k. Afişaţi în ordine crescătoare acele numere date care sunt puteri ale lui k.

Date de intrare[edit | edit source]

Fişierul de intrare puterikin.txt conţine pe prima linie numerele n şi k, iar pe a doua linie n numere naturale separate prin spaţii.

Date de ieşire[edit | edit source]

Fişierul de ieşire puterikout.txt va conţine pe prima linie numerele care sunt puteri ale lui k, separate printr-un spaţiu, în ordine crescătoare.

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 100
  • 2 ⩽ k ⩽ 10
  • numerele de pe a doua linie a fişierului de intrare vor avea cel mult 8 cifre

Exemplul 1[edit | edit source]

puterikin.txt
8 2
32 56 317 809 256 2 1 60
puterikout.txt
Datele de intrare corespund restrictiilor impuse
1 2 32 256


Exemplul 2[edit | edit source]

puterikin.txt
gjkfjgkfjgkfgf
puterikout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. Funcția de validare verifică dacă datele de intrare sunt în intervalul specificat

def validare(n_validare, k_validare, numere_validare):

   # Verificăm dacă n este în intervalul 1-100
   if n_validare < 1 or n_validare > 100:
       raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 1-100
   # Verificăm dacă k este în intervalul 2-10
   if k_validare < 2 or k_validare > 10:
       raise ValueError  # Ridicăm o eroare dacă k nu este în intervalul 2-10
   for numar in numere_validare:    # Parcurgem lista de numere
       # Verificăm dacă numărul are cel mult 8 cifre
       if len(str(numar)) > 8:
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


  1. Funcția puterik calculează numerele care sunt puteri ale lui k

def puterik(k, numere):

   import math  # Importăm modulul math pentru a folosi funcția log
   # Verificăm dacă fiecare număr este o putere a lui k și creăm o listă cu aceste numere
   puteri_k = [num for num in numere if (num != 0 and ((math.log(num, k) % 1) == 0))]
   puteri_k.sort()  # Sortăm lista în ordine crescătoare
   return puteri_k


if __name__ == '__main__':

   file_in = open("puterikin.txt", "r")
   file_out = open("puterikout.txt", "w")
   try:
       # Citim numărul de numere și k
       n_main, k_main = map(int, file_in.readline().split())
       # Citim numerele
       numere_main = list(map(int, file_in.readline().split()))
       # Validăm datele de intrare
       validare(n_main, k_main, numere_main)
       # Calculăm numerele care sunt puteri ale lui k
       puteri_k_main = puterik(k_main, numere_main)
       # Scriem numerele care sunt puteri ale lui k în fișierul de ieșire
       file_out.write(' '.join(map(str, puteri_k_main)) + '\n')
   # Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>