0280 - Pal Max: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursă: [https://www.pbinfo.ro/probleme/280/palmax] == Cerinţa == Se dau mai multe numere naturale. Determinaţi cel mai mare număr palindrom aflat printre numerele date şi de câte ori apare. == Date de intrare == Programul citește de la tastatură numere naturale, până la apariţia lui zero, care nu se ia în considerare. == Date de ieşire == Programul afișează pe ecran numerele '''palindrom_maxim''' şi '''nr_aparitii''', numărul palindrom maxim şi numărul de...
 
No edit summary
 
Line 6: Line 6:
Programul citește de la tastatură numere naturale, până la apariţia lui zero, care nu se ia în considerare.
Programul citește de la tastatură numere naturale, până la apariţia lui zero, care nu se ia în considerare.
== Date de ieşire ==
== Date de ieşire ==
Programul afișează pe ecran numerele '''palindrom_maxim''' şi '''nr_aparitii''', numărul palindrom maxim şi numărul de apariţii, separate printr-un spaţiu, sau mesajul '''NU EXISTA''', dacă printre numerele date nu există nici un număr palindrom
Dacă datele introduse sunt corecte, pe ecran se va afișa '''"Datele introduse sunt corecte."''', apoi programul afișează numerele '''p''' şi '''c''', numărul palindrom maxim şi numărul de apariţii, separate printr-un spaţiu, sau mesajul '''NU EXISTA''', dacă printre numerele date nu există nici un număr palindrom. În caz contrar, se va afișa pe ecran mesajul  '''"Datele introduse nu sunt corecte."'''.
== Restricții și precizări ==
== Restricții și precizări ==
* fiecare dintre numerele citite va avea cel mult '''9''' cifre;
* fiecare dintre numerele citite va avea cel mult '''9''' cifre;
Line 14: Line 14:
: 78 56 5665 98789 5665 88 98789 12521 5665 0
: 78 56 5665 98789 5665 88 98789 12521 5665 0
; Ieșire
; Ieșire
: Datele introduse sunt corecte.
: 98789 2
: 98789 2
== Rezolvare ==
== Rezolvare ==


<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#0280


def este_palindrom(numar):
def este_palindrom(numar):
Line 28: Line 30:
     return numar == invers
     return numar == invers


numere = []
while True:
    numar = int(input())
    if numar == 0:
        break
    numere.append(numar)


palindrom_maxim = None
def validare_date_intrare(numere, lungime_maxima=9):
nr_aparitii = 0
    if not numere:
for numar in numere:
        return False
    if este_palindrom(numar) and (palindrom_maxim is None or numar > palindrom_maxim):
    for numar in numere:
        palindrom_maxim = numar
        if not isinstance(numar, int) or numar <= 0 or numar > 10**lungime_maxima - 1:
        nr_aparitii = 1
            return False
    elif numar == palindrom_maxim:
    return True
        nr_aparitii += 1
 
 
def rezolva_problema(numere):
    palindrom_maxim = None
    nr_aparitii = 0
    for numar in numere:
        if este_palindrom(numar) and (palindrom_maxim is None or numar > palindrom_maxim):
            palindrom_maxim = numar
            nr_aparitii = 1
        elif numar == palindrom_maxim:
            nr_aparitii += 1
 
    if palindrom_maxim is not None:
        print(palindrom_maxim, nr_aparitii)
    else:
        print("NU EXISTA")
 
 
if __name__ == "__main__":
    numere = []
    while True:
        try:
            numar = int(input("Introduceti un numar natural: "))
        except ValueError:
            print("Datele introduse nu sunt corecte.")
            break
        if numar == 0:
            break
        numere.append(numar)
 
    if validare_date_intrare(numere):
        print("Datele introduse sunt corecte.")
        rezolva_problema(numere)
    else:
        print("Datele introduse nu sunt corecte.")
 


if palindrom_maxim is not None:
    print(palindrom_maxim, nr_aparitii)
else:
    print("NU EXISTA")


</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare ==
Funcția '''este_palindrom(numar)''' primește un număr și verifică dacă acesta este palindrom. În cadrul funcției, numărul este inversat prin adăugarea cifrelor din număr de la dreapta la stânga, pornind de la cifra unităților și până la cifra cea mai semnificativă. Dacă numărul inițial și cel inversat sunt egale, atunci funcția returnează '''True''', altfel '''False'''.<br><br>Funcția '''validare_date_intrare(numere, lungime_maxima=9)''' primește o listă de numere și verifică dacă acestea sunt numere naturale cu lungimea maximă admisă specificată (9 cifre în cazul de față). Funcția returnează '''True''' dacă toate numerele din listă respectă condițiile și '''False''' în caz contrar.<br><br>Funcția '''rezolva_problema(numere)''' primește o listă de numere și găsește cel mai mare palindrom din listă și numărul de apariții ale acestuia în listă. Variabila palindrom_maxim inițial este None. Dacă un număr este palindrom și este mai mare decât '''palindrom_maxim''', acesta devine '''palindrom_maxim''' și variabila '''nr_aparitii''' este resetată la 1. Dacă un alt număr palindrom este egal cu '''palindrom_maxim''', '''nr_aparitii''' este incrementată cu 1. Dacă există cel puțin un palindrom în listă, funcția afișează '''palindrom_maxim''' și '''nr_aparitii'''. În caz contrar, afișează '''NU EXISTA'''.<br><br>În blocul '''if __name__ == "__main__":''', programul citește numere de la utilizator și încearcă să valideze datele de intrare. Dacă datele sunt valide, apoi se apelează funcția '''rezolva_problema(numere)'''. În caz contrar, se afișează un mesaj corespunzător.

Latest revision as of 18:15, 28 April 2023

Sursă: [1]

Cerinţa[edit]

Se dau mai multe numere naturale. Determinaţi cel mai mare număr palindrom aflat printre numerele date şi de câte ori apare.

Date de intrare[edit]

Programul citește de la tastatură numere naturale, până la apariţia lui zero, care nu se ia în considerare.

Date de ieşire[edit]

Dacă datele introduse sunt corecte, pe ecran se va afișa "Datele introduse sunt corecte.", apoi programul afișează numerele p şi c, numărul palindrom maxim şi numărul de apariţii, separate printr-un spaţiu, sau mesajul NU EXISTA, dacă printre numerele date nu există nici un număr palindrom. În caz contrar, se va afișa pe ecran mesajul "Datele introduse nu sunt corecte.".

Restricții și precizări[edit]

  • fiecare dintre numerele citite va avea cel mult 9 cifre;

Exemplu[edit]

Intrare
78 56 5665 98789 5665 88 98789 12521 5665 0
Ieșire
Datele introduse sunt corecte.
98789 2

Rezolvare[edit]

<syntaxhighlight lang="python" line>

  1. 0280

def este_palindrom(numar):

   invers = 0
   copie = numar
   while copie > 0:
       ultima_cifra = copie % 10
       invers = invers * 10 + ultima_cifra
       copie //= 10
   return numar == invers


def validare_date_intrare(numere, lungime_maxima=9):

   if not numere:
       return False
   for numar in numere:
       if not isinstance(numar, int) or numar <= 0 or numar > 10**lungime_maxima - 1:
           return False
   return True


def rezolva_problema(numere):

   palindrom_maxim = None
   nr_aparitii = 0
   for numar in numere:
       if este_palindrom(numar) and (palindrom_maxim is None or numar > palindrom_maxim):
           palindrom_maxim = numar
           nr_aparitii = 1
       elif numar == palindrom_maxim:
           nr_aparitii += 1
   if palindrom_maxim is not None:
       print(palindrom_maxim, nr_aparitii)
   else:
       print("NU EXISTA")


if __name__ == "__main__":

   numere = []
   while True:
       try:
           numar = int(input("Introduceti un numar natural: "))
       except ValueError:
           print("Datele introduse nu sunt corecte.")
           break
       if numar == 0:
           break
       numere.append(numar)
   if validare_date_intrare(numere):
       print("Datele introduse sunt corecte.")
       rezolva_problema(numere)
   else:
       print("Datele introduse nu sunt corecte.")


</syntaxhighlight>

Explicație rezolvare[edit]

Funcția este_palindrom(numar) primește un număr și verifică dacă acesta este palindrom. În cadrul funcției, numărul este inversat prin adăugarea cifrelor din număr de la dreapta la stânga, pornind de la cifra unităților și până la cifra cea mai semnificativă. Dacă numărul inițial și cel inversat sunt egale, atunci funcția returnează True, altfel False.

Funcția validare_date_intrare(numere, lungime_maxima=9) primește o listă de numere și verifică dacă acestea sunt numere naturale cu lungimea maximă admisă specificată (9 cifre în cazul de față). Funcția returnează True dacă toate numerele din listă respectă condițiile și False în caz contrar.

Funcția rezolva_problema(numere) primește o listă de numere și găsește cel mai mare palindrom din listă și numărul de apariții ale acestuia în listă. Variabila palindrom_maxim inițial este None. Dacă un număr este palindrom și este mai mare decât palindrom_maxim, acesta devine palindrom_maxim și variabila nr_aparitii este resetată la 1. Dacă un alt număr palindrom este egal cu palindrom_maxim, nr_aparitii este incrementată cu 1. Dacă există cel puțin un palindrom în listă, funcția afișează palindrom_maxim și nr_aparitii. În caz contrar, afișează NU EXISTA.

În blocul if __name__ == "__main__":, programul citește numere de la utilizator și încearcă să valideze datele de intrare. Dacă datele sunt valide, apoi se apelează funcția rezolva_problema(numere). În caz contrar, se afișează un mesaj corespunzător.