0967 - Cifre 8

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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[edit | edit source]

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

Date de ieşire[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

Intrare
10 9
1943 31 19 1199 34 941 7971 131 223 6
Ieșire
1345
6
4

Explicație[edit | edit source]

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[edit | edit source]

<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

if __name__ == '__main__':

   n, c = map(int, input().split())
   s = list(map(int, input().split()))
   if not validare_date(n, c, s):
       print("Datele de intrare nu corespund restricțiilor impuse.")
   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)
       print("Datele de intrare corespund restricțiilor impuse.")


</syntaxhighlight>

Explicație rezolvare[edit | edit source]

Acesta este un program care primește o listă de numere și o cifră, efectuează anumite calcule pe baza acestor date și afișează rezultatele. Programul verifică dacă datele de intrare sunt valide și afișează un mesaj corespunzător.