歡迎大家訂閱【藍橋杯Python每日一練】 專欄,開啟你的 Python數據結構與算法 學習之旅!
文章目錄
- 1 進制轉換
- 2 例題分析
1 進制轉換
①任意制轉為十進制
【示例】
②十進制轉為任意制
【法一】
【法二】
2 例題分析
題目地址:https://www.lanqiao.cn/problems/1230/learning/
樣例輸入
2
2 10
10101
11 2
1793A5068
樣例輸出
21
10101111001010100111010101011
【示例代碼】
# 定義字符集并構建字符到整數的映射
int_to_char = "0123456789ABCDEF"
char_to_int = {chr: idx for idx, chr in enumerate(int_to_char)}# k進制字符串轉換為十進制整數
# 輸入:k(源進制),x(字符串)
def K_To_Ten(k, x):ans = 0x = x[::-1] # 反轉字符串,以便從最低位開始計算for i in range(len(x)):ans += char_to_int[x[i]] * k**i # 每位轉換為十進制return ans# 十進制轉換為任意 k 進制
# 輸入:k(目標進制),x(十進制整數)
def Ten_To_K(k, x):if x == 0: # 處理特殊情況,如果十進制數為0return "0"ans = ""while x != 0:ans += int_to_char[x % k] # 取余并轉換為目標進制字符x //= k # 向下取整除以移除當前最低位return ans[::-1] # 反轉結果字符串以正確排列位序# 實現進制轉換邏輯
T = int(input()) # 讀取測試用例數量
for _ in range(T):N, M = map(int, input().split()) # 讀取源進制和目標進制x = input().strip() # 讀取源進制數字串# 先將源進制數字串轉換為十進制整數y = K_To_Ten(N, x)# 將十進制整數轉換為目標進制數字串z = Ten_To_K(M, y)# 輸出結果print(z)
【代碼分析】
①字符集定義和映射
int_to_char = "0123456789ABCDEF"
char_to_int = {chr: idx for idx, chr in enumerate(int_to_char)}
-
int_to_char
: 包括所有可能出現在任意進制表示中的字符集合,支持 0 到 15 進制數字。- 例如:
0, 1, 2, 3, ... 9, A, B, C, D, E, F
- 例如:
-
char_to_int
: 字符到整數的映射字典。'0'
映射為 0'1'
映射為 1'A'
映射為 10'B'
映射為 11- 依此類推…
-
實現原理:用
enumerate
生成索引與字符的映射。
for idx, chr in enumerate(int_to_char): char_to_int[chr] = idx
這一步操作將char_to_int
構建為如下形式:
{'0': 0, '1': 1, '2': 2, '3': 3,'4': 4, ...'A': 10,'B': 11,...'F': 15
}
該字典用于轉換任意進制字符和整數之間的相互轉換。
②從任意源進制字符串轉換為十進制
定義 K_To_Ten
函數
def K_To_Ten(k, x):ans = 0x = x[::-1] # 反轉字符串,以便從最低位開始計算for i in range(len(x)):ans += char_to_int[x[i]] * k**i # 每位轉換為十進制return ans
a. 參數
k
: 源進制,例如二進制為 ( k = 2 )。x
: 輸入字符串,例如二進制字符串"10101"
。
b. 流程解析
- 反轉字符串:
- 在進制轉換中,從右往左處理數字更簡單。
x[::-1]
實現字符串反轉。
- 逐位轉換:
- 每位通過索引獲取其整數值,并計算其在十進制的值。
- 公式:
char_to_int[x[i]] * k**i
。char_to_int[x[i]]
獲取當前字符對應的整數值。k**i
表示當前位在十進制數中的權重。
- 返回結果:
ans
包括轉換后的十進制結果。
③從十進制轉換為任意目標進制字符串
定義 Ten_To_K
函數
def Ten_To_K(k, x):if x == 0: # 處理特殊情況,如果十進制數為0return "0"ans = ""while x != 0:ans += int_to_char[x % k] # 取余并轉換為目標進制字符x //= k # 向下取整除以移除當前最低位return ans[::-1] # 反轉結果字符串以正確排列位序
a. 參數
k
: 目標進制,例如十進制轉換為二進制時 ( k = 2 )。x
: 十進制整數。
b. 流程解析
- 特殊情況處理:如果十進制輸入為 0,直接返回
"0"
。 - 轉換邏輯:
- 每次通過
x % k
取當前位的余數。 - 通過
x //= k
逐步去除當前最低位。 - 每位轉換后用
int_to_char
轉換為目標字符。
- 每次通過
- 反轉結果字符串:因為轉換從最低位開始,需要將結果字符串反轉。
④主邏輯
T = int(input()) # 讀取測試用例數量
for _ in range(T):N, M = map(int, input().split()) # 讀取源進制和目標進制x = input().strip() # 讀取源進制數字串y = K_To_Ten(N, x) # 轉換為十進制整數z = Ten_To_K(M, y) # 轉換為目標進制數字串print(z)
- 首先讀取測試用例的數量
T
。 - 對每個測試用例:
- 讀取源進制
N
和目標進制M
。 - 讀取源進制數字字符串
x
。
- 讀取源進制
- 調用函數依次轉換:
K_To_Ten(N, x)
將源進制轉換成十進制整數。Ten_To_K(M, y)
將十進制轉換為目標進制字符串。
- 輸出轉換結果。
【運行結果】