0187 - CifFrecv: Difference between revisions
Pagină nouă: Sursă: [https://www.pbinfo.ro/probleme/187/ciffrecv 0187 - CifFrecv] |
tot |
||
Line 1: | Line 1: | ||
Sursă: [https://www.pbinfo.ro/probleme/187/ciffrecv 0187 - CifFrecv] | Sursă: [https://www.pbinfo.ro/probleme/187/ciffrecv 0187 - CifFrecv] | ||
---- | |||
==Cerinţă== | |||
Să se scrie un program care citeşte cel mult <code>1.000.000</code> de numere naturale din intervalul închis <code>[0,9]</code> ş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 <code>1.000.000</code> numere naturale din intervalul închis <code>[0,9]</code>, 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 <code>MAX</code> şi <code>NR_AP.</code> Î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 <code>is_integer(value)</code> verifică dacă o valoare dată este un număr întreg. | |||
Funcția <code>este_prim(n)</code> primește un număr <code>n</code> și returnează <code>True</code> dacă acesta este un număr prim, <code>False</code> altfel. Funcția verifică numerele în intervalul <code>[2, sqrt(n)]</code>, pentru a optimiza timpul de execuție. | |||
Funcția <code>verificare_vector(vector)</code> 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 <code>cel_mai_mare_prim_si_aparitii(lst)</code> 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. |
Latest revision as of 12:42, 15 April 2023
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.