3459 - Count Prime

De la Universitas MediaWiki

Cerinţa

Să se calculeze cate numere prime sunt în intervalul [stanga, dreapta].

Date de intrare

Fișierul de intrare countprime.in conține pe prima linie două numere stanga și dreapta.

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 countprime.out va conține pe prima linie numărul cnt, reprezentând numărul de numere prime din intervalul dat. Î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

  • 1 ⩽ stanga ⩽ dreapta ⩽ 2 ** 32
  • dreapta - stanga ⩽ 1.000.000

Exemplu

countprime.in
2 10
countprime.out
Datele sunt introduse corect.

Explicație

Sunt 4 numere prime în intervalul [2, 10].

Rezolvare

def validare_date(stanga, dreapta):
    flag = False
    if stanga.isdigit() and dreapta.isdigit(): #verificam daca ambele string-uri pot fi convertite in numere intregi
        if 0 < int(stanga) < int(dreapta) <= 2 ** 32 and int(dreapta) - int(stanga) <= 1_000_000: #verificam daca cele doua numere se afla in intervalul si au o diferenta mai mica sau egala cu 1.000.000
            flag = True
    return flag

def prim(n):
    #Funcția verifică dacă un număr este prim
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def câte_prime(stanga, dreapta):
    #Funcția calculează numărul de numere prime din intervalul [stanga, dreapta]
    nr = 0
    for n in range(stanga, dreapta + 1):
        if prim(n):
            nr += 1
    return nr

if __name__ == '__main__':
    with open('countprime.in', 'r') as fin, open('countprime.out', 'w') as fout:
        stanga, dreapta = fin.readline().split() #citim cele doua numere din fișierul de intrare

        if validare_date(stanga, dreapta): #verificăm dacă cele două numere respectă condițiile impuse
            cnt = câte_prime(int(stanga), int(dreapta)) #calculăm numărul de numere prime din intervalul [stanga, dreapta]

            fout.write("Datele sunt introduse corect.\n") #scriem mesajul in fișierul de ieșire
            fout.write(str(cnt)) #scriem in fisierul de ieșire numărul de numere prime

        else:
            fout.write("Datele introduse nu  corespund restrictiilor impuse.")#în cazul în care nu sunt respectate condițiile impuse afișăm mesajul corespunzător