0187 - CifFrecv

De la Universitas MediaWiki

Sursă: 0187 - CifFrecv


Cerinţă

Să se scrie un program care citeşte cel mult 1.000.000 de numere naturale din intervalul închis [0,9] şi determină cel mai mare număr prim citit şi numărul său de apariții.

Date de intrare

Programul va citi de la tastatură cel mult 1.000.000 numere naturale din intervalul închis [0,9], separate prin spaţii.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte!", apoi se vor afișa două numere naturale MAX şi NR_AP. În cazul în care datele nu respectă restricțiile, se va afișa mesajul "Datele introduse nu sunt corecte!".

Restricţii şi precizări

  • 1 <= n <= 1000000
  • valorile elementelor șirului vor fi cuprinse între 0 și 9

Exemple

Exemplul 1

Intrare
Introduceti numere de maxim o cifra separate prin spatiu:1 2 3 4 5 6 7 8 9
Ieșire
Datele introduse sunt corecte!
7 1

Exemplul 2

Intrare
Introduceti numere de maxim o cifra separate prin spatiu:12 1 2 3
Ieșire
Datele introduse sunt incorecte!

Exemplul 3

Intrare
Introduceti numere de maxim o cifra separate prin spatiu:1 2 3 3 3 6
Ieșire
Datele introduse sunt corecte!
3 3

Rezolvare

def is_integer(value):
    return value.isdigit()


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


def verificare_vector(vector):
    n = 0
    for i in vector:
        if is_integer(i):
            if 0 < int(i) < 10:
                n += 1
            else:
                print("Datele introduse sunt incorecte!")
                exit()
        else:
            print("Datele introduse sunt incorecte!")
            exit()
    if n > 1000000 or n < 0:
        print("Datele introduse sunt incorecte!")
        exit()


def cel_mai_mare_prim_si_aparitii(lst):
    aparitii = {}
    cel_mai_mare_prim = None
    for nr in lst:
        if este_prim(nr):
            if nr in aparitii:
                aparitii[nr] += 1
            else:
                aparitii[nr] = 1
            if cel_mai_mare_prim is None or nr > cel_mai_mare_prim:
                cel_mai_mare_prim = nr
    if cel_mai_mare_prim is None:
        print("Nu s-au găsit numere prime în listă.")
        exit()
    max_aparitii = max(aparitii.values())
    for nr, aparitie in aparitii.items():
        if aparitie == max_aparitii and nr > cel_mai_mare_prim:
            cel_mai_mare_prim = nr
    print(cel_mai_mare_prim, max_aparitii)


if __name__ == '__main__':
    elem = input(f"Introduceti numere de maxim o cifra separate prin spatiu:").split()
    verificare_vector(elem)
    lst_int = list(map(int, elem))
    print("Datele introduse sunt corecte!")
    cel_mai_mare_prim_si_aparitii(lst_int)

Explicație rezolvare

Acest program citeste de la tastatură o listă de numere naturale cu o singură cifră, cu o limită maximă de 1.000.000 de numere, iar apoi determină cel mai mare număr prim din listă și numărul său de apariții în listă.

Funcția is_integer(value) verifică dacă o valoare dată este un număr întreg.

Funcția este_prim(n) primește un număr n și returnează True dacă acesta este un număr prim, False altfel. Funcția verifică numerele în intervalul [2, sqrt(n)], pentru a optimiza timpul de execuție.

Funcția verificare_vector(vector) primește o listă și verifică dacă toate elementele acesteia sunt numere întregi cu o singură cifră, iar numărul total de elemente nu depășește 1.000.000.

Funcția cel_mai_mare_prim_si_aparitii(lst) primește lista de numere și determină cel mai mare număr prim din listă și numărul său de apariții. Verifică fiecare număr dacă este prim și dacă da, îl adaugă într-un dicționar, cu numărul de apariții. Dacă un număr prim are mai multe apariții decât numărul cel mai mare prim de până acum, atunci acesta devine noul număr cel mai mare prim.

Programul afișează numărul cel mai mare prim și numărul său de apariții în listă. Dacă nu există numere prime în listă, se afișează un mesaj corespunzător.