0187 - CifFrecv

From Bitnami MediaWiki
Revision as of 12:42, 15 April 2023 by Miriam (talk | contribs) (tot)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursă: 0187 - CifFrecv


Cerinţă[edit | edit source]

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

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

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

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

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

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

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

Exemplul 3[edit | edit source]

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

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

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.