Python入門習題(99)——OpenJudge百練習題:2進制轉化爲16進制

題目描述

來源
OpenJudge網站 —— 百練習題集-第2798號習題

要求
總時間限制: 1000ms 內存限制: 65536kB

描述

輸入一個2進制的數,要求輸出該2進制數的16進製表示。
在16進制的表示中,A-F表示10-15
輸入
第1行是測試數據的組數n,後面跟着n行輸入。每組測試數據佔1行,包括一個以0和1組成的字符串,字符串長度至少是1,至多是10000
輸出
n行,每行輸出對應一個輸入。
樣例輸入
2
100000
111
樣例輸出
20
7

解題思路

第一種解法:使用Python內置函數完成進制轉換

  1. 對於輸入的二進制串bin_str,調用int(bin_str, 2)轉換爲十進制整數number。
  2. 調用hex函數轉換爲16進制字符串。注意:該16進制字符串以’0x’打頭,而且數碼a, b, c, d, e, f是小寫的。因此,完整的寫法hex(number)[2:].upper()。upper()方法是把小寫轉換成大寫。

第二種解法:據進製表示的原理手工轉換

  1. 二進制轉換爲十六進制的原理是:從右到左(即從低位到高位),每4位二進制轉換爲1位十六進制。
  2. 對於二進制轉換爲十六進制,要注意的細節是二進制位的數目不見得是4的倍數。爲此,左邊補上0,使二進制位的數目成爲4的倍數。這樣,從左到右每4位二進制轉換爲1位十六進制也是可行的。
  3. 4位二進制four_bits轉換爲1位十六進制hex_bit的轉換規則是:
    (1)用以下式子求出4位二進制four_bits對應的十進制數字d :
        d = int(four_bits[0]) * 8 + int(four_bits[1]) * 4 + int(four_bits[2]) * 2 + int(four_bits[3])
    (2)如果d是0,1, 2, …, 9,那麼數碼就是0, 1, 2, …, 9。如果d是10,11, 12, 13, 14或15,那麼數碼是A, B, C, D, E, F。

參考答案

第一種解法:使用Python內置函數完成進制轉換

n = int(input())
for i in range(n):
    bin_str = input()
    number = int(bin_str, 2)
    print(hex(number)[2:].upper())

第二種解法:據進製表示的原理手工轉換

#四位二進制four_bits轉換爲一位16進制
def four_bits_hex_bit(four_bits):
	#d是四位二進制對應的10進制整數
    d = int(four_bits[0]) * 8 + int(four_bits[1]) * 4 + int(four_bits[2]) * 2 + int(four_bits[3])
    if d < 10:
        return str(d)
    else:
        return chr(ord('A') + d - 10)  #得到A, B, C, D, E或F的數碼

n = int(input())
for i in range(n):
    bin_str = input()
    #如果bin_str的二進制位數的數目不是4的倍數,那麼左邊湊上0,使數目成爲4的倍數
    len_mod_4 = len(bin_str) % 4
    if len_mod_4 > 0:
        bin_str = '0' * (4 - len_mod_4) + bin_str
    #從左到右,每4位二進制轉換爲1位16進制
    hex_str = ''
    for j in range(0, len(bin_str) // 4):
        hex_str += four_bits_hex_bit(bin_str[4 * j:4*j+4])
    print(hex_str)

測試用例

  1. 題目描述給出的測試用例有兩組測試數據。第一組測試數據有6位二進制。第二組測試數據有3位二進制。二進制位數的數目都不是4的倍數。

  2. 考察A, B, C, D, E, F這6個數碼。測試數據的二進制位數的數目是4的倍數。
    樣例輸入
    1
    101010111100110111101111
    樣例輸出
    ABCDF

  3. 考察0,1,2, …, 9這10個數碼。
    樣例輸入
    10
    0
    1
    10
    11
    100
    101
    110
    111
    1000
    1001
    樣例輸出
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

小結

  1. 本文提供兩種解法,供對比。在學習進製表示時,老師可以要求學生依據進制原理來實現進制轉換。
  2. 由於16 = 24,故有4位二進制轉換成1位十六進制。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章