1300 - Hex

De la Universitas MediaWiki

Enunț

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ță

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


Date de intrare

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


Date de ieșire

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

  • 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

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

Explicație

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

Rezolvare ver. 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)

Explicație

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.