2121 - Tan
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[edit | edit source]
Cunoscând numărul n
furnizat de bancă, să se determine numărul TAN
obţinut de Petrică.
Date de intrare[edit | edit source]
Fişierul input.txt
conţine pe prima linie numărul natural n
cu semnificaţia din enunţ.
Date de ieșire[edit | edit source]
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[edit | edit source]
• 0 < n < 18*10**18
• numărul TAN
obţinut nu poate conţine zerouri nesemnificative
Exemplul 1[edit | edit source]
input.txt:
520
output.txt:
250
Explicație:
Cel mai mic număr par format cu cifrele 5, 2, 0
este 250
.
Exemplul 2[edit | edit source]
input.txt:
9999999999999999999999999999999999999999999
Output:
Input-ul nu convine conditiilor
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> 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))
</syntaxhighlight>