0999 - Numere 7: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
Line 23: Line 23:


== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line="1">
# 0999 Numere 7
# 0999 Numere 7
def verificare(nr1, nr2):
def verificare(nr1, nr2):                   # functia de verificare a datelor de intrare
     if nr1 > 2000000 or nr2 > 2000000:
     if nr1 > 2000000 or nr2 > 2000000:     # daca nu respecta cerintele vom ridica eroarea valueError
         raise ValueError
         raise ValueError
     return True
     return True




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


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


     while nr_2:
     while nr_2:                             # notam cifrele celui de-al doilea numar in vectorul de frecventa
         u_cif = int(nr_2 % 10)
         u_cif = int(nr_2 % 10)
         frecventa_cifre[u_cif] += 1
         frecventa_cifre[u_cif] += 1
         nr_2 //= 10
         nr_2 //= 10
     ok = False
 
     for cifra in range(1, 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]:
         while frecventa_cifre[cifra]:
             frecventa_cifre[cifra] -= 1
             frecventa_cifre[cifra] -= 1
             file_out.write(str(cifra))
             file_out.write(str(cifra))
             ok = True
             ok = True                       # daca am gasit, notam ca am gasit si atunci putem opri cautarea
         if ok:
         if ok:
             break
             break


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


Line 63: Line 63:
if __name__ == '__main__':
if __name__ == '__main__':


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


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


     except ValueError:
     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.")
         file_out.write("Datele de intrare nu corespund restricțiilor impuse.")
       
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 17:18, 2 May 2023

Cerința[edit | edit source]

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

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

Date de ieșire[edit | edit source]

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

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

Exemplu 1[edit | edit source]

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


Exemplu 2[edit | edit source]

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


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

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

</syntaxhighlight>