0280 - Pal Max

De la Universitas MediaWiki

Sursă: [1]

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

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

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

Exemplu

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

Rezolvare

#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.")

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.

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.