0187 - CifFrecv
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
<syntaxhighlight lang="python" line="1"> 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)
</syntaxhighlight>
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.