0999 - Numere 7: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
(4 intermediate revisions by the same user not shown)
Line 2: Line 2:
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.
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 ==
== Date de intrare ==
Fișierul de intrare numere7.in conține pe prima linie cele două numere.
Fișierul de intrare numere7in.txt conține pe prima linie cele două numere.
== Date de ieșire ==  
== Date de ieșire ==  
Fișierul de ieșire numere7.out va conține pe prima linie numărul cerut.
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 ==
== Restricții și precizări ==
:- cele două numere date vor fi mai mici decât 2 000 000 000
:- cele două numere date vor fi mai mici decât 2 000 000 000
== Exemplu 1 ==
== Exemplu 1 ==
; numere7.in
; numere7in.txt
: 36321    4173
: 36321    4173
; numere7.out
; numere7out.txt
: Datele introduse corespund restricțiilor impuse.
: Datele introduse corespund restricțiilor impuse.
: 112333467
: 112333467
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
numere7.in
numere7in.txt
:2 000 344 678                            8 000 000 000
:2 000 344 678                            8 000 000 000
; numere7.out
; numere7out.txt
: Datele de intrare nu corespund restricțiilor impuse.
: Datele de intrare nu corespund restricțiilor impuse.
<br>
<br>


== 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 62: 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>

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>