0967 - Cifre 8
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>