0268 - Div K

De la Universitas MediaWiki

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 sunt introduse corect.
100 400 56

Rezolvare

import math

# 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


# 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


# 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