3312 - Eratostene1

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Sursa: - Eratostene1


Cerinţa

Se dau n numere naturale. Aflaţi câte dintre aceste numere sunt prime.

Date de intrare

Fișierul de intrare eratostene1.in conține pe prima linie numărul n, iar 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 corecte.", iar apoi in fişierul de ieşire eratostene1.out va conţine pe prima linie numărul nr_prime, numărul numerelor prime aflate în fişierul de intrare. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n ≤ 500.000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000

Exemple

Exemplul 1

eratostene1.in
6
12 18 19 25 29 7
Ieșire
Datele sunt corecte.
eratostene1.out
3

Exemplul 2

eratostene1.in
3
100 102 104
Ieșire
Datele sunt corecte.
eratostene1.out
0

Exemplul 3

eratostene1.in
3
191824719471 19991 19724174
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

#3312 Eratostene1

def eratostene(vector, n):
    nr_prime = 0
    for i in range(n):
        numar = vector[i]
        if numar == 2:
            nr_prime += 1
        divizor = 3
        while divizor * divizor <= numar:
            if numar % divizor == 0 or numar%2==0:
                break
            divizor += 2
        if divizor ** 2 > numar:
            nr_prime += 1
    f = open("eratostene1.out", "w")
    f.write(str(nr_prime))


def conform_restrictiilor():
    vector = list()
    with open('eratostene1.in') as f:
        lines = f.readlines()
        for line in lines:
            for c in line.split():
                if c.isdigit() == True:
                    vector.append(int(c))
    n = vector[0]
    vector = vector[1:]
    if n > 500000 and n < 1:
        print("Datele nu sunt comform restricțiilor impuse.")
        exit()
    for x in vector:
        if x < 0 or x > 1000000:
            print("Datele nu sunt comform restricțiilor impuse.")
            exit()
    print("Datele sunt corecte.")
    return vector, n


if __name__ == '__main__':
    vector, n = conform_restrictiilor()
    eratostene(vector, n)