0268 - Div K: Difference between revisions
Pagină nouă: == 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 == 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,... |
|||
(2 intermediate revisions by the same user not shown) | |||
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 == | ||
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 13: | Line 13: | ||
: 100 9 400 56 7 10 | : 100 9 400 56 7 10 | ||
; divk.out | ; divk.out | ||
: Datele introduse | : Datele sunt introduse corect. | ||
: 100 400 56 | : 100 400 56 | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
import math | import math | ||
def validare_date_numar( | |||
# Funcție care verifică dacă sunt respectate restricțiile impuse | |||
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( | 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 38: | Line 43: | ||
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 53: | Line 59: | ||
if __name__ == '__main__': | 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('divk.in', 'r') as | with open('div.out', 'w') as f_out: | ||
n, k = map(int, | 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> | </syntaxhighlight> |
Latest revision as of 10:39, 25 April 2023
Cerinţa[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 1 ⩽ n ⩽ 100
- numerele de pe a doua linie a fişierului de intrare, precum şi k vor avea cel mult 9 cifre
Exemplu[edit | edit source]
- divk.in
- 6 5
- 100 9 400 56 7 10
- divk.out
- Datele sunt introduse corect.
- 100 400 56
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> 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
</syntaxhighlight>