练9:进制转换
欢迎大家订阅【蓝桥杯Python每日一练】 专栏,开启你的 Python数据结构与算法 学习之旅!
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 = 0
x = 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: # 处理特殊情况,如果十进制数为0
return "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 = 0
x = 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: # 处理特殊情况,如果十进制数为0
return "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)
将十进制转换为目标进制字符串。
- 输出转换结果。
【运行结果】
原文地址:https://blog.csdn.net/2302_80253507/article/details/144353145
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!