0268 - Div K: Difference between revisions

From Bitnami MediaWiki
No edit summary
Line 4: Line 4:
Fişierul de intrare '''divk.in''' conţine pe prima linie numerele '''n''' şi '''k''', iar pe a doua linie '''n''' numere naturale separate prin spaţii.
Fişierul de intrare '''divk.in''' 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 ==
== Date de ieşire ==
Fişierul de ieşire '''divk.out''' va conţine pe prima linie numerele care au cel puţin '''k''' divizori, separate printr-un spaţiu, în ordinea în care au fost citite.
Dacă datele sunt introduse corect, în fișier se va afișa:'''"Datele sunt introduse corect."''', apoi pe un rând nou fişierul de ieşire '''divk.out''' va conţine pe prima linie numerele care au cel puţin '''k''' divizori, separate printr-un spaţiu, în ordinea în care au fost citite. În cazul în care datele nu respectă restricțiile, se va afișa în fișier:'''"Datele nu corespund restricțiilor impuse."'''.
== Restricții și precizări ==
== Restricții și precizări ==
* 1 ⩽ n ⩽ 100
* 1 ⩽ n ⩽ 100
Line 19: Line 19:
import math
import math


# Funcție care verifică dacă sunt respectate restricțiile impuse
def validare_date_numar(numar):
def validare_date_numar(numar):
     flag = False
     flag = False
     if numar.isdigit():
     if numar.isdigit(): # Verificăm dacă toate caracterele sunt cifre
         if 0 <= int(numar) <= 1_000_000_000:
         if 0 <= int(numar) <= 1_000_000_000: # Verificăm dacă numărul este în intervalul permis
             flag = True
             flag = True
     return flag
     return flag




# Funcție care verifică dacă sunt respectate restricțiile impuse
def validare_date_numere(n):
def validare_date_numere(n):
     flag = False
     flag = False
     if 0 <= int(n) <= 1000:
     if 0 <= int(n) <= 1000: # Verificăm dacă numărul este în intervalul permis
         flag = True
         flag = True
     return flag
     return flag




# Funcție care găsește toate numerele dintr-o listă cu cel puțin k divizori
def numere_cu_k_divizori(n, k, numere):
def numere_cu_k_divizori(n, k, numere):
     rezultat = []
     rezultat = []
Line 39: Line 42:
     for nr in numere:
     for nr in numere:
         divizori = 0
         divizori = 0
         rad_nr = int(math.sqrt(nr))
         rad_nr = int(math.sqrt(nr)) # Calculează radicalul numărului


        # Numărăm divizorii până la radicalul numărului
         for i in range(1, rad_nr + 1):
         for i in range(1, rad_nr + 1):
             if nr % i == 0:
             if nr % i == 0:
                 divizori += 2
                 divizori += 2 # Adăugăm doi divizori la numărul total (i și nr // i)
                 if i == nr // i:
                 if i == nr // i:
                     divizori -= 1
                     divizori -= 1 # Dacă divizorii sunt egali, eliminăm unul din total


         if divizori >= k:
         if divizori >= k:
Line 54: Line 58:


if __name__ == '__main__':
if __name__ == '__main__':
     k = input()
     with open('divk.in', 'r') as f_in:
     if validare_date_numar(k):
        n, k = map(int, f_in.readline().split()) # Citim n și k din fișierul de intrare
         print("\nDatele de intrare corespund restricțiilor impuse.\n")
     if not validare_date_numere(n):
         with open('div.out', 'w') as f_out:
            f_out.write("\nDatele nu corespund restricțiilor impuse.\n")
            exit()
 
    else:
         with open('divk.in', 'r') as f:
         with open('divk.in', 'r') as f:
             n, k = map(int, f.readline().split())
             n, k = map(int, f.readline().split()) # Citim din nou n și k din fișierul de intrare
             numere = list(map(int, f.readline().split()))
             numere = list(map(int, f.readline().split())) # Citim lista de numere


         rezultat = numere_cu_k_divizori(n, k, numere)
         rezultat = numere_cu_k_divizori(n, k, numere) # Calculăm rezultatul


         with open('divk.out', 'w') as f:
         with open('divk.out', 'w') as f:
             f.write(' '.join(map(str, rezultat)))
            f.write("Datele sunt introduse corect.\n")
 
             f.write(' '.join(map(str, rezultat))) # Scriem rezultatul în fișierul de ieșire
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")




</syntaxhighlight>
</syntaxhighlight>

Revision as of 18:29, 11 April 2023

Cerinţa

Se dau n numere naturale şi un număr natural k. Afişaţi acele numere date care au cel puţin k divizori.

Date de intrare

Fişierul de intrare divk.in 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

Dacă datele sunt introduse corect, în fișier se va afișa:"Datele sunt introduse corect.", apoi pe un rând nou fişierul de ieşire divk.out va conţine pe prima linie numerele care au cel puţin k divizori, separate printr-un spaţiu, în ordinea în care au fost citite. În cazul în care datele nu respectă restricțiile, se va afișa în fișier:"Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 1 ⩽ n ⩽ 100
  • numerele de pe a doua linie a fişierului de intrare, precum şi k vor avea cel mult 9 cifre

Exemplu

divk.in
6 5
100 9 400 56 7 10
divk.out
Datele introduse corespund restricțiilor impuse.
100 400 56

Rezolvare

<syntaxhighlight lang="python" line> import math

  1. Funcție care verifică dacă sunt respectate restricțiile impuse

def validare_date_numar(numar):

   flag = False
   if numar.isdigit(): # Verificăm dacă toate caracterele sunt cifre
       if 0 <= int(numar) <= 1_000_000_000: # Verificăm dacă numărul este în intervalul permis
           flag = True
   return flag


  1. Funcție care verifică dacă sunt respectate restricțiile impuse

def validare_date_numere(n):

   flag = False
   if 0 <= int(n) <= 1000: # Verificăm dacă numărul este în intervalul permis
       flag = True
   return flag


  1. Funcție care găsește toate numerele dintr-o listă cu cel puțin k divizori

def numere_cu_k_divizori(n, k, numere):

   rezultat = []
   for nr in numere:
       divizori = 0
       rad_nr = int(math.sqrt(nr)) # Calculează radicalul numărului
       # Numărăm divizorii până la radicalul numărului
       for i in range(1, rad_nr + 1):
           if nr % i == 0:
               divizori += 2 # Adăugăm doi divizori la numărul total (i și nr // i)
               if i == nr // i:
                   divizori -= 1 # Dacă divizorii sunt egali, eliminăm unul din total
       if divizori >= k:
           rezultat.append(nr)
   return rezultat


if __name__ == '__main__':

   with open('divk.in', 'r') as f_in:
       n, k = map(int, f_in.readline().split()) # Citim n și k din fișierul de intrare
   if not validare_date_numere(n):
       with open('div.out', 'w') as f_out:
           f_out.write("\nDatele nu corespund restricțiilor impuse.\n")
           exit()
   else:
       with open('divk.in', 'r') as f:
           n, k = map(int, f.readline().split()) # Citim din nou n și k din fișierul de intrare
           numere = list(map(int, f.readline().split())) # Citim lista de numere
       rezultat = numere_cu_k_divizori(n, k, numere) # Calculăm rezultatul
       with open('divk.out', 'w') as f:
           f.write("Datele sunt introduse corect.\n")
           f.write(' '.join(map(str, rezultat))) # Scriem rezultatul în fișierul de ieșire


</syntaxhighlight>