4296 - Sum Div

From Bitnami MediaWiki

Cerinţa

Se dă un șir de n numere naturale nenule și de asemenea un număr natural p. Să se calculeze suma numerelor din șir care au cel puțin p divizori.

Date de intrare

Programul citește de la tastatură numerele nr și p, iar apoi șirul de n numere naturale, separate prin spații.

Date de ieşire

Programul va afișa pe ecran numărul suma, reprezentând suma numerelor din șir care au cel puțin p divizori.

Restricții și precizări

  • nr ∈ Ν
  • 1 ⩽ nr ⩽ 100.000
  • 1 ⩽ p ⩽ 100.000
  • cele n numere din șir vor fi numere naturale nenule mai mici decât 1.000.000

Exemplu1

Intrare
5 3
7 4 10 17 1
Ieșire
Datele de intrare corespund restricțiilor impuse.
14

Explicație

Numerele din șir care au cel puțin 3 divizori sunt 4 și 10, iar suma lor este 14.

Exemplu2

Intrare
5 100
5 12 24 3 72
Ieșire
Datele introduse corespund restricțiilor impuse.
0

Explicație

Niciun număr nu are cel puțin 100 de divizori, deci suma este 0.

Rezolvare

<syntaxhighlight lang="python" line> import math


def validare_date(nr, p, n):

   flag = False
   if 0 <= int(nr) <= 1_000 and 1 <= int(p) <= 1_0000:
       flag = all(isinstance(x, int) and 1 <= x <= 1_000_000 for x in n)
   return flag


def nrdiv(n):

   cnt = 0
   for i in range(1, int(math.sqrt(n))+1):
       if n % i == 0:
           cnt += 2
       if i * i == n:
           cnt -= 1
   return cnt


def suma_p_divizori(n, p):

   suma = 0
   for i in n:
       if nrdiv(i) >= p:
           suma += i
   return suma


if __name__ == '__main__':

   nr, p = map(int, input().split())
   n = list(map(int, input().split()))
   if validare_date(nr, p, n):
       print("\nDatele de intrare corespund restricțiilor impuse.\n")
       suma = suma_p_divizori(n, p)
       print(suma)
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")

</syntaxhighlight>

Explicație

Codul calculează suma numerelor dintr-o listă dată, care au cel puțin p divizori. Datele de intrare sunt primite de la utilizator și sunt validate prin funcția validare_date(). Funcția nrdiv() calculează numărul de divizori ai unui număr dat, iar funcția suma_p_divizori() calculează suma numerelor din listă care au cel puțin p divizori. Dacă datele de intrare corespund restricțiilor impuse, se afișează suma calculată, altfel se afișează un mesaj corespunzător.