OpenJudge百練第2798號習題: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內置函數完成進制轉換
- 對於輸入的二進制串bin_str,調用int(bin_str, 2)轉換爲十進制整數number。
- 調用hex函數轉換爲16進制字符串。注意:該16進制字符串以’0x’打頭,而且數碼a, b, c, d, e, f是小寫的。因此,完整的寫法hex(number)[2:].upper()。upper()方法是把小寫轉換成大寫。
第二種解法:據進製表示的原理手工轉換
- 二進制轉換爲十六進制的原理是:從右到左(即從低位到高位),每4位二進制轉換爲1位十六進制。
- 對於二進制轉換爲十六進制,要注意的細節是二進制位的數目不見得是4的倍數。爲此,左邊補上0,使二進制位的數目成爲4的倍數。這樣,從左到右每4位二進制轉換爲1位十六進制也是可行的。
- 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)
測試用例
-
題目描述給出的測試用例有兩組測試數據。第一組測試數據有6位二進制。第二組測試數據有3位二進制。二進制位數的數目都不是4的倍數。
-
考察A, B, C, D, E, F這6個數碼。測試數據的二進制位數的數目是4的倍數。
樣例輸入
1
101010111100110111101111
樣例輸出
ABCDF -
考察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
小結
- 本文提供兩種解法,供對比。在學習進製表示時,老師可以要求學生依據進制原理來實現進制轉換。
- 由於16 = 24,故有4位二進制轉換成1位十六進制。