0100 - NrApPrime

De la Universitas MediaWiki

Sursa: 0100 - NrApPrime


Cerinţa

Se citeşte n şi un şir de n numere naturale. Să se determine câte elemente din şir sunt numere prime.

Date de intrare

Fişierul de intrare nrapprime.in conţine pe prima linie numărul n şi pe a doua linie n numere naturale separate prin spaţii.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi, fişierul de ieşire nrapprime.out va conţine pe prima linie un singur număr natural, reprezentând numărul de elemente prime din şir. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."'.

Restricţii şi precizări

  • 0 < n < 100
  • numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1.000.000.000

Exemple

Exemplul 1

nrapprime.in
5
25 17 2 10 13
Ecran
Datele sunt introduse corect.
nrapprime.out
3

Exemplul 2

nrapprime.in
5
5 3 2 4
Ecran
Datele nu corespund restricțiilor impuse.


Rezolvare

# 0100 NrApPrime

def e_prim(numar):
    if numar <= 1:
        return False
    for i in range(2, int(numar**0.5) + 1):
        if numar % i == 0:
            return False
    return True


def numar_elemente_prime(vector):
    nr_prime = 0
    for numar in vector:
        if e_prim(numar):
            nr_prime += 1
    return nr_prime


def citire_conform_restrictiilor(n, vector):
    if n < 1 or n >= 100:
        print("Datele nu corespund restricțiilor impuse.")
        exit()
    for element in vector:
        if element >= 1000000000:
            print("Datele nu corespund restricțiilor impuse.")
            exit()
    if n != len(vector):
        print("Datele nu corespund restricțiilor impuse.")
        exit()
    print("Datele sunt introduse corect.")


if __name__ == '__main__':
    with open('nrapprime.in', 'r') as in_file:
        n = int(in_file.readline().strip())
        vector = list(map(int, in_file.readline().strip().split()))
    citire_conform_restrictiilor(n, vector)
    nr_prime = numar_elemente_prime(vector)
    with open('nrapprime.out', 'w') as out_file:
        out_file.write(str(nr_prime))

Explicație rezolvare

   Programul de mai sus începe în main ( if __name__ == '__main__' , linia 34) unde se deschide fișierul de intrare 'nrapprime.in' pentru a citi valorile lui n și vector, apoi se apelează funcția citire_conform_restrictiilor() pentru a verifica restricțiile asupra datelor de intrare, se calculează numărul de elemente prime din vector folosind funcția numar_elemente_prime(), și apoi se scrie rezultatul în fișierul de ieșire 'nrapprime.out' folosind funcția write().
Funcția citire_conform_restrictiilor(n, vector) verifică dacă datele de intrare (n și vector) corespund restricțiilor impuse de problemă. Se verifică dacă n este mai mic decât 1 sau mai mare sau egal cu 100, și dacă fiecare element din vector este mai mic decât 1.000.000.000. De asemenea, se verifică dacă n este egal cu lungimea vectorului vector. Dacă oricare dintre condiții este încălcată, se va afișa pe ecran mesajul „Datele nu corespund restricțiilor impuse.” și se va ieși din program cu comanda exit(). Dacă toate condițiile sunt respectate, se va afișa mesajul „Datele sunt introduse corect.” (linia 31) și se va continua programul.
Funcția e_prim(numar) verifică dacă un număr numar este prim. Dacă numar este mai mic sau egal cu 1, se returnează False, deoarece numerele prime sunt definite ca fiind mai mari decât 1. Apoi, se parcurge intervalul [2, sqrt(numar)] și se verifică dacă numar este divizibil cu vreun număr din acest interval. Dacă este divizibil, funcția returnează False, altfel returnează True.
Funcția numar_elemente_prime(vector) primește un vector de numere întregi vector și calculează numărul de elemente prime din acest vector. Se inițializează un contor nr_prime cu valoarea 0 și se parcurge fiecare număr din vector. Pentru fiecare număr, se apelează funcția e_prim() pentru a verifica dacă este prim. Dacă este prim, se incrementează contorul nr_prime. La final, se returnează nr_prime.