0280 - Pal Max

From Bitnami MediaWiki
Revision as of 18:15, 28 April 2023 by Tamas Claudia (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursă: [1]

Cerinţa[edit | edit source]

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

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

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

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

Exemplu[edit | edit source]

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

Rezolvare[edit | edit source]

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

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.