0967 - Cifre 8

From Bitnami MediaWiki

Cerinţa

Scrieţi un program care să citească numerele c, n şi şirul s, şi să determine: a) suma tuturor numerelor din şirul s care au proprietatea că sunt numere prime b) numărul de apariţii ale cifrei c în scrierea zecimală a tuturor numerelor din şirul s c) numărul minim de numere din şirul v

Date de intrare

Programul citește de la tastatură numerele n c, iar apoi cele n elemente ale șirului s.

Date de ieşire

Programul va afișa pe ecran trei numere, câte unul pe o linie, reprezentând în ordine:

  • suma tuturor numerelor din şirul s care au proprietatea că sunt numere prime
  • numărul de apariţii ale cifrei c în scrierea zecimală a tuturor numerelor din şirul s
  • numărul minim de valori din şirul v

Restricții și precizări

  • Numerele n şi c sunt naturale
  • 2 ≤ n ≤ 10000
  • 0 ≤ c ≤ 9
  • toate cele n numere naturale din şirul s sunt mai mici sau egale cu 30000
  • pentru rezolvarea cerinţei a) se acordă 40% din punctaj, pentru cerinţa b) 20% din punctaj şi pentru cerinţa c) 40% din punctaj.

Exemplu

Intrare
10 9

1943 31 19 1199 34 941 7971 131 223 6

Ieșire
1345
6
4

Explicație

a) numerele prime din şirul s sunt: 31, 19, 941, 131 şi 223. Suma acestora este 1345. b) cifra c=9 apare de 6 ori în scrierea numerelor din s. c) cifrele impare ale unităţilor numerelor din s sunt, în ordine crescătoare: 1, 1, 1, 1, 3, 3, 9, 9. Se pot forma minimum 4 numere cu toate cifrele identice: 11, 11, 33, 99, fiecare număr din noul şir având numărul maxim posibil de cifre, adică 2. Numărul minim de termeni ai şirului este egal cu 4.

Rezolvare

<syntaxhighlight lang="python" line>

  def este_prim(numar):
   if numar < 2:
       return False
   for i in range(2, int(numar ** 0.5) + 1):
       if numar % i == 0:
           return False
   return True

def aparitii_cifra(numar, cifra):

   aparitii = 0
   while numar > 0:
       if numar % 10 == cifra:
           aparitii += 1
       numar //= 10
   return aparitii

def minim_numere(sir):

   frecventa = {}
   for numar in sir:
       if numar not in frecventa:
           frecventa[numar] = 4
       else:
           frecventa[numar] += 1
   return min(frecventa.values())

def validare_date(n, c, s):

   if not (2 <= n <= 10000):
       return False
   if not (0 <= c <= 9):
       return False
   if not all(1 <= x <= 30000 for x in s):
       return False
   return True

n, c = map(int, input().split()) s = list(map(int, input().split()))

if not validare_date(n, c, s):

   print("Date de intrare invalide")

else:

   suma_prime = 0
   aparitii_cifra_c = 0
   for numar in s:
       if este_prim(numar):
           suma_prime += numar
       aparitii_cifra_c += aparitii_cifra(numar, c)
   nr_minim_numere = minim_numere(s)
   print(suma_prime)
   print(aparitii_cifra_c)
   print(nr_minim_numere)


</syntaxhighlight>