2121 - Tan

De la Universitas MediaWiki

Petrică, tânăr licean în clasa a IX-a, a primit în dar de la părinţii săi un cont bancar pentru micile sale cheltuieli curente. El este pasionat de Internet Banking şi îşi verifică cu grijă toate tranzacţiile efectuate. Pentru creşterea securităţii tranzacţiilor online, banca îi furnizează lui Petrică un număr pe care el va trebui să îl modifice, obţinând un număr TAN – număr de autentificare a tranzacţiei (transaction authentication number). Regula de obţinere a numărului TAN este următoarea: se formează cel mai mic număr par din toate cifrele numărului furnizat de bancă.

Cerința

Cunoscând numărul n furnizat de bancă, să se determine numărul TAN obţinut de Petrică.

Date de intrare

Fişierul input.txt conţine pe prima linie numărul natural n cu semnificaţia din enunţ.

Date de ieșire

Fişierul de ieşire output.txt va conţine o singură linie pe care va fi scris numărul TAN cerut.

Restricții și precizări

0 < n < 18*10**18

• numărul TAN obţinut nu poate conţine zerouri nesemnificative

Exemplul 1

input.txt:

520

output.txt:

250

Explicație:

Cel mai mic număr par format cu cifrele 5, 2, 0 este 250.

Exemplul 2

input.txt:

9999999999999999999999999999999999999999999

Output:

Input-ul nu convine conditiilor

Rezolvare

def verificare(n):
    if not(1<=n<18*(10**18)):
        print("Input-ul nu convine conditiilor")
        exit()

with open("input.txt", "r") as cin, open("output.txt", "w") as cout:
    n = int(cin.readline())
    verificare(n)
    fr = [0] * 10
    x = 0
    par = 0
    cif_min = 10
    pare = 0

    while n:
        fr[n % 10] += 1

        if cif_min > n % 10 and n % 10:
            cif_min = n % 10

        if par < n % 10 and n % 10 % 2 == 0:
            par = n % 10

        if n % 10 % 2 == 0:
            pare += 1

        n //= 10

    x = x * 10 + cif_min
    fr[cif_min] -= 1

    if cif_min % 2 == 0:
        pare -= 1

    if not pare:
        x = 0
        fr[cif_min] += 1

    if cif_min == par and not fr[par]:
        for i in range(0, 9, 2):
            if fr[i]:
                par = i
                break

    for i in range(10):
        if i == par:
            while fr[i] > 1:
                x = x * 10 + i
                fr[i] -= 1
        else:
            while fr[i]:
                x = x * 10 + i
                fr[i] -= 1

    if fr[par]:
        x = x * 10 + par

    cout.write(str(x))