0999 - Numere 7

De la Universitas MediaWiki

Cerința

Se dau două numere naturale diferite. Afişaţi cel mai mic număr care poate fi scris folosind toate cifrele celor două numere date.

Date de intrare

Fișierul de intrare numere7in.txt conține pe prima linie cele două numere.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: " Datele de intrare corespund restrictiilor impuse" și fișierul de ieșire numere7out.txt va conține pe prima linie numărul cerut. Iar dacă restricțiile nu sunt îndeplinite, se va afișa mesajul:" Datele de intrare nu corespund restrictiilor impuse".

Restricții și precizări

- cele două numere date vor fi mai mici decât 2 000 000 000

Exemplu 1

numere7in.txt
36321 4173
numere7out.txt
Datele introduse corespund restricțiilor impuse.
112333467


Exemplu 2

numere7in.txt
2 000 344 678 8 000 000 000
numere7out.txt
Datele de intrare nu corespund restricțiilor impuse.


Rezolvare

# 0999 Numere 7
def verificare(nr1, nr2):                   # functia de verificare a datelor de intrare
    if nr1 > 2000000 or nr2 > 2000000:      # daca nu respecta cerintele vom ridica eroarea valueError
        raise ValueError
    return True


def numere6(nr_1, nr_2):                    # functia de rezolvare
    frecventa_cifre = []                    # ne vom folosi de un vector de frecventa pentru a vedea cate cifre avem
    for i in range(10):
        frecventa_cifre.append(0)

    while nr_1:                             # notam cifrele primului numar in vectorul de frecventa
        u_cif = int(nr_1 % 10)
        frecventa_cifre[u_cif] += 1
        nr_1 //= 10

    while nr_2:                             # notam cifrele celui de-al doilea numar in vectorul de frecventa
        u_cif = int(nr_2 % 10)
        frecventa_cifre[u_cif] += 1
        nr_2 //= 10

    ok = False                              # trebuie sa scriem prima cifra nenula
    for cifra in range(1, 10):              # cautam in vectorul de frecventa cifra de la 1 la 9
        while frecventa_cifre[cifra]:
            frecventa_cifre[cifra] -= 1
            file_out.write(str(cifra))
            ok = True                       # daca am gasit, notam ca am gasit si atunci putem opri cautarea
        if ok:
            break

    for cifra in range(0, 10):              # luam acum in ordine normala cifrele din vectorul de frecventa
        while frecventa_cifre[cifra]:
            frecventa_cifre[cifra] -= 1     # de cate ori gasim o cifra in vectorul de frecventa, o afisam
            file_out.write(str(cifra))


if __name__ == '__main__':

    file_in = open("numere7in.txt")             # declararea fisierelor
    file_out = open("numere7out.txt", "w")      # fisierul de iesire declarat cu clauza "w" (write)
    numere = file_in.readline().split()         # citirea celor 2 numere

    try:                                        # ne asteptam la eroarea ValueError din cauza datelor de intrare eronate
        numar_1 = int(numere[0])                # transformam numerele primite in int, daca nu se poate va fi ValueError
        numar_2 = int(numere[1])
        verificare(numar_1, numar_2)            # apelul functiei de verificare
        numere6(numar_1, numar_2)               # apelul functiei de rezolvare

    except ValueError:                          # daca apare eroare inseamna ca datele de intrare nu au fost valide
        file_out.write("Datele de intrare nu corespund restricțiilor impuse.")