2547 - Divizori 3

De la Universitas MediaWiki

Cerinţa

Se citesc două numere naturale numar1 și numar2 (numar1 < numar2) având cel mult 9 cifre fiecare. Afișați câte numere din intervalul [numar1, numar2] au exact 3 divizori.

Date de intrare

Programul citește de la tastatură numerele numar1 și numar2, separate printr-un spațiu.

Date de ieşire

Programul va afișa pe ecran numărul de numere din intervalul [numar1,numar2]care au exact 3 divizori.

Restricții și precizări

  • 1 ≤ numar1< numar2 < 1.000.000.000

Exemplu

Intrare
11 50
Ieșire
2

Explicație

Numerele din intervalul [11,50] care au exact 3 divizori sunt 25 și 49.

Rezolvare

def validare_date(numar1, numar2):
    flag = False

    if numar1.isdigit() and numar2.isdigit():
        if 0 < int(numar1) < int(numar2) <= 1_000_000_000 and int(numar2) - int(numar1) <= 1000:
            flag = True

    return flag

def numar_divizori(n):
    divizori = 0
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            divizori += 2
            if n // i == i:
                divizori -= 1
        if divizori > 3:
            break
    return divizori == 3

def main():
    numar1, numar2 = input().split()

    if validare_date(numar1, numar2):
        numar1 = int(numar1)
        numar2 = int(numar2)

        numar = 0
        for i in range(numar1, numar2 + 1):
            if numar_divizori(i):
                numar += 1

        print(numar)

    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")

if __name__ == "__main__":
    main()

Explicație rezolvare

Acest cod Python are ca scop găsirea numărului de numere care au exact trei divizori, între două numere date.

Funcția validare_date primește două numere sub formă de string și returnează o valoare booleană, True dacă cele două numere sunt valide și False dacă nu sunt. Pentru ca cele două numere să fie considerate valide, trebuie să fie numere întregi pozitive, cu o valoare cuprinsă între 1 și 1 miliard, iar diferența dintre cele două numere trebuie să fie mai mică sau egală cu 1000.

Funcția numar_divizori primește un număr întreg pozitiv și returnează o valoare booleană, True dacă numărul are exact trei divizori și False dacă nu. Pentru a determina numărul de divizori, funcția parcurge toți divizorii numărului și îi numără. Dacă numărul de divizori ajunge la 3, atunci funcția returnează True, în caz contrar, returnează False.

Funcția main este funcția principală care este apelată la pornirea programului. Funcția primește de la utilizator două numere sub formă de string, le validează folosind funcția validare_date, le convertește la intregi și calculează numărul de numere care au exact trei divizori, apelând funcția numar_divizori. Numărul de astfel de numere este apoi afișat. În cazul în care datele introduse nu sunt valide, funcția afișează un mesaj de eroare.

Astfel, acest program primește două numere de la utilizator și afișează numărul de numere care au exact trei divizori între aceste două numere.