3301 - Nr Div 9

De la Universitas MediaWiki

Cerința

Se dă un număr natural n. Să se scrie un program care determină și afișează pe ecran numărul de numere mai mici sau egale cu n care au exact 9 divizori.

Date de intrare

Programul citește din fișierul nrdiv9in.txt numărul n.

Date de ieșire

Programul scrie în fișierul nrdiv9out.txt numărul k, reprezentând numărul de numere mai mici sau egale cu n care au exact 9 divizori.

Restricții și precizări

  • 1 ⩽ n ⩽ 1.000.000.000;
  • dacă nu există numere mai mici sau egale cu n care au exact 9 divizori se va afișa valoarea 0.

Exemplu 1

nrdiv9in.txt
100
nrdiv9out.txt
2


Explicație

Sunt 2 numere mai mici sau egale cu 100 care au exact 9 divizori: 36 și 100.

Exemplu 2

nrdiv9in.txt
1000
nrdiv9out.txt
8

Explicație

Sunt 8 numere mai mici sau egale cu 1000 care au exact 9 divizori: 36, 100, 196, 225, 256, 441, 484, 676.

Exemplu 3

nrdiv9in.txt
0
nrdiv9out.txt
Nu au fost respectate cerintele impuse

Rezolvare

#3301 - NrDiv9
def count_divisors(num):
    divisors = 0
    sqrt_num = int(num**0.5)
    for i in range(1, sqrt_num + 1):
        if num % i == 0:
            divisors += 2  # i și num // i sunt divizori
            if i == num // i:
                divisors -= 1  # în cazul pătratelor perfecte, numărăm un divizor o singură dată
    return divisors

def count_numbers_with_9_divisors(n):
    count = 0
    for num in range(1, n + 1):
        if count_divisors(num) == 9:
            count += 1
    return count

try:
    # Citirea datelor de intrare
    with open('nrdiv9in.txt', 'r') as f:
        n = int(f.readline().strip())

    # Calculul și scrierea rezultatului în fișierul de ieșire
    count = count_numbers_with_9_divisors(n)
    with open('nrdiv9out.txt', 'w') as g:
        if count:
            g.write(str(count) + '\n')
        else:
            g.write("Nu au fost respectate cerintele impuse")
except Exception as e:
    print("A apărut o eroare:", str(e))