0967 - Cifre 8

De la Universitas 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

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.")

Explicație rezolvare

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.