2330 - prim023: Difference between revisions
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2330/prim023 - prim023] ---- == Cerinţa == Dorel a scris un şir format din '''n''' numere naturale nenule. Apoi a luat fiecare subşir şi a calculat produsul termenilor săi. Aflaţi câte dintre produsele efectuate sunt numere prime. == Date de intrare == Fișierul de intrare '''prim023.in''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale nenule separate prin spații. == Date de ieșire == Dac... |
|||
(One intermediate revision by the same user not shown) | |||
Line 25: | Line 25: | ||
; prim023.in | ; prim023.in | ||
: 4 | : 4 | ||
: | : 13 3123 414 41241 | ||
; Ieșire | ; Ieșire | ||
: Datele sunt corecte. | : Datele sunt corecte. | ||
; prim023.out | ; prim023.out | ||
: | : 1 | ||
===Exemplul 3=== | ===Exemplul 3=== | ||
; prim023.in | ; prim023.in | ||
Line 39: | Line 39: | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
#2330 prim023 | |||
def este_prim(n): | |||
if n <= 1: | |||
return False | |||
for i in range(2, int(n**0.5) + 1): | |||
if n % i == 0: | |||
return False | |||
return True | |||
def prim023(vector, n): | |||
with open("prim023.out", "w") as f: | |||
count = 0 | |||
for i in range(1 << n): | |||
product = 1 | |||
for j in range(n): | |||
if i & (1 << j): | |||
product *= vector[j] | |||
if este_prim(product): | |||
count += 1 | |||
f.write(str(count)) | |||
def conform_restrictiilor(): | |||
with open('prim023.in') as f: | |||
n = int(f.readline()) | |||
vector = list(map(int, f.read().split())) | |||
if n > 5000: | |||
print("Datele nu sunt conform restricțiilor impuse.") | |||
exit() | |||
for x in vector: | |||
if x > 1000000000: | |||
print("Datele nu sunt conform restricțiilor impuse.") | |||
exit() | |||
print("Datele sunt corecte.") | |||
return n, vector | |||
if __name__ == '__main__': | |||
n, vector = conform_restrictiilor() | |||
prim023(vector,n) | |||
Line 44: | Line 86: | ||
==Explicaţie cod== | ==Explicaţie cod== | ||
Acesta este un program care primește un fișier de intrare și calculează numărul de produse prime ale elementelor din fișierul de intrare. | |||
Funcția '''este_prim''' primește un număr și returnează True dacă numărul este prim și False altfel. Verifică dacă numărul este mai mic sau egal cu 1 și, în caz afirmativ, returnează False. Pentru ceilalți întregi pozitivi, se iterază prin toate numerele de la 2 până la rădăcina pătrată a numărului și se verifică dacă numărul este divizibil cu vreunul dintre acestea. Dacă da, returnează False. În caz contrar, returnează True. | |||
Funcția '''prim023''' primește o listă de numere și numărul de elemente din această listă. Se deschide un fișier de ieșire '''prim023.out'''. Funcția apoi iterează prin toate combinațiile posibile ale elementelor din lista dată și înmulțește elementele care apar în acea combinație. Dacă produsul este prim, numără acest lucru. La sfârșit, numărul de produse prime este scris în fișierul de ieșire. | |||
Funcția '''conform_restrictiilor''' deschide fișierul de intrare '''prim023.in'''. Citeste numărul de elemente din listă și lista de numere din fișier. Verifică dacă numărul de elemente din listă este mai mic sau egal cu 5000 și dacă toate elementele listei sunt mai mici sau egale cu 1000000000. În caz contrar, afișează un mesaj de eroare și iese din program. Dacă datele sunt corecte, funcția returnează numărul de elemente și lista de numere. | |||
În '''main''', se apelează funcția conform_restrictiilor pentru a obține datele din fișierul de intrare și apoi se apelează funcția '''prim023''' pentru a calcula numărul de produse prime și a le scrie în fișierul de ieșire '''prim023.out'''. |
Latest revision as of 15:04, 30 April 2023
Sursa: - prim023
Cerinţa[edit | edit source]
Dorel a scris un şir format din n numere naturale nenule. Apoi a luat fiecare subşir şi a calculat produsul termenilor săi. Aflaţi câte dintre produsele efectuate sunt numere prime.
Date de intrare[edit | edit source]
Fișierul de intrare prim023.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fișierul de ieșire prim023.out va conține pe prima linie numărul produselor care sunt numere prime. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- 1 ≤ n ≤ 5.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
- un subşir conţine cel puţin un termen şi se formează alegând o parte din termenii şirului
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- prim023.in
- 3
- 1 2 3
- Ieșire
- Datele sunt corecte.
- prim023.out
- 4
Exemplul 2[edit | edit source]
- prim023.in
- 4
- 13 3123 414 41241
- Ieșire
- Datele sunt corecte.
- prim023.out
- 1
Exemplul 3[edit | edit source]
- prim023.in
- 2
- 314441 41241241
- Ieșire
- Datele nu sunt comform restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2330 prim023
def este_prim(n):
if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True
def prim023(vector, n):
with open("prim023.out", "w") as f: count = 0 for i in range(1 << n): product = 1 for j in range(n): if i & (1 << j): product *= vector[j] if este_prim(product): count += 1 f.write(str(count))
def conform_restrictiilor():
with open('prim023.in') as f: n = int(f.readline()) vector = list(map(int, f.read().split())) if n > 5000: print("Datele nu sunt conform restricțiilor impuse.") exit() for x in vector: if x > 1000000000: print("Datele nu sunt conform restricțiilor impuse.") exit() print("Datele sunt corecte.") return n, vector
if __name__ == '__main__':
n, vector = conform_restrictiilor() prim023(vector,n)
</syntaxhighlight>
Explicaţie cod[edit | edit source]
Acesta este un program care primește un fișier de intrare și calculează numărul de produse prime ale elementelor din fișierul de intrare.
Funcția este_prim primește un număr și returnează True dacă numărul este prim și False altfel. Verifică dacă numărul este mai mic sau egal cu 1 și, în caz afirmativ, returnează False. Pentru ceilalți întregi pozitivi, se iterază prin toate numerele de la 2 până la rădăcina pătrată a numărului și se verifică dacă numărul este divizibil cu vreunul dintre acestea. Dacă da, returnează False. În caz contrar, returnează True.
Funcția prim023 primește o listă de numere și numărul de elemente din această listă. Se deschide un fișier de ieșire prim023.out. Funcția apoi iterează prin toate combinațiile posibile ale elementelor din lista dată și înmulțește elementele care apar în acea combinație. Dacă produsul este prim, numără acest lucru. La sfârșit, numărul de produse prime este scris în fișierul de ieșire.
Funcția conform_restrictiilor deschide fișierul de intrare prim023.in. Citeste numărul de elemente din listă și lista de numere din fișier. Verifică dacă numărul de elemente din listă este mai mic sau egal cu 5000 și dacă toate elementele listei sunt mai mici sau egale cu 1000000000. În caz contrar, afișează un mesaj de eroare și iese din program. Dacă datele sunt corecte, funcția returnează numărul de elemente și lista de numere.
În main, se apelează funcția conform_restrictiilor pentru a obține datele din fișierul de intrare și apoi se apelează funcția prim023 pentru a calcula numărul de produse prime și a le scrie în fișierul de ieșire prim023.out.