4296 - Sum Div

From Bitnami MediaWiki
Revision as of 14:14, 22 March 2023 by Robert Manc (talk | contribs) (Pagină nouă: == 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''' di...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 introduse 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>