2330 - prim023

De la Universitas MediaWiki

Sursa: - 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ă 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

  • 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

Exemplul 1

prim023.in
3
1 2 3
Ieșire
Datele sunt corecte.
prim023.out
4

Exemplul 2

prim023.in
4
13 3123 414 41241
Ieșire
Datele sunt corecte.
prim023.out
1

Exemplul 3

prim023.in
2
314441 41241241
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

#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)

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.