1300 - Hex: Difference between revisions

From Bitnami MediaWiki
 
Line 85: Line 85:
</syntaxhighlight>
</syntaxhighlight>


==Explicatie==
==Explicație==


Funcția validate_binary_number verifică dacă numărul dat este valid, adică este scris în baza 2.
Funcția validate_binary_number verifică dacă numărul dat este valid, adică este scris în baza 2.

Latest revision as of 17:20, 7 May 2023

Enunț[edit | edit source]

Andino este un elev pasionat de informatică. Din păcate, profesoara de matematică l-a prins rezolvând probleme de informatică în ora ei. Totuşi, ştiind că el este un elev bun, a decis să-i dea o provocare.

Ea i-a dat o foaie pe care era scris un număr b în baza 2 şi i-a cerut să îl transforme în baza 16 într-un timp cât mai scurt.

Andino, fiind în criză de timp, vă roagă să-l ajutaţi!

Cerință[edit | edit source]

Să se transforme numărul dat de profesoară în baza 16.


Date de intrare[edit | edit source]

Fișierul de intrare hex.in conține pe prima linie numărul b, scris în baza 2.


Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." Fișierul de ieșire hex.out va conține pe prima linie numărul x, reprezentând numărul b scris în baza 16. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări[edit | edit source]

  • 1 ≤ lungimea numărului dat ≤ 10000
  • Cifrele în baza 16 sunt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
  • Pentru 40% din teste, 1 ≤ lungimea numărului ≤ 20
  • Dacă îl ajutaţi pe Andino să rezolve problema, el vă va răsplăti cu 100 de puncte


Exemplul 1[edit | edit source]

hex.in
1001010
hex.out
4A
Ieșire
Datele de intrare corespund restricțiilor impuse.

Explicație[edit | edit source]

Numărul 1001010(2) este scrierea în baza 2 a numărului 74(10). Scrierea în sistemul hexazecimal a numărului 74 este 4A(16).

Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

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

def validate_binary_number(binary_number):

   for digit in binary_number:
       if digit not in ['0', '1']:
           return False
   return True

def binary_to_decimal(binary_number):

   decimal_number = 0
   for digit in binary_number:
       decimal_number = decimal_number * 2 + int(digit)
   return decimal_number

def decimal_to_hex(decimal_number):

   hex_digits = "0123456789ABCDEF"
   hex_number = ""
   while decimal_number > 0:
       remainder = decimal_number % 16
       hex_number = hex_digits[remainder] + hex_number
       decimal_number //= 16
   return hex_number

if __name__ == '__main__':

   with open('hex.in', 'r') as fin:
       binary_number = fin.readline().strip()
   if not validate_binary_number(binary_number):
       print('Datele de intrare nu corespund restricțiilor impuse.')
   else:
       print("Datele de intrare corespund restricțiilor impuse.")
       decimal_number = binary_to_decimal(binary_number)
       hex_number = decimal_to_hex(decimal_number)
       with open('hex.out', 'w') as fout:
           fout.write(hex_number)


</syntaxhighlight>

Explicație[edit | edit source]

Funcția validate_binary_number verifică dacă numărul dat este valid, adică este scris în baza 2.

Funcția binary_to_decimal convertește numărul dat din baza 2 în baza 10, prin parcurgerea cifrelor numărului și adunarea puterilor de 2 corespunzătoare cifrelor de 1.

Funcția decimal_to_hex convertește numărul dat din baza 10 în baza 16, prin împărțirea repetată a numărului la 16 și adăugarea cifrei corespunzătoare rămășiței în șirul rezultat.

În blocul if __name__ == '__main__':, citim numărul dat din fișierul de intrare hex.in, verificăm dacă este valid, apoi convertim numărul din baza 2 în baza 10 și din baza 10 în baza 16. La final, scriem rezultatul în fișierul de ieșire hex.out.