自学内容网 自学内容网

练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)
  1. 首先读取测试用例的数量 T
  2. 对每个测试用例:
    • 读取源进制 N 和目标进制 M
    • 读取源进制数字字符串 x
  3. 调用函数依次转换:
    • K_To_Ten(N, x) 将源进制转换成十进制整数。
    • Ten_To_K(M, y) 将十进制转换为目标进制字符串。
  4. 输出转换结果。

【运行结果】
在这里插入图片描述


原文地址:https://blog.csdn.net/2302_80253507/article/details/144353145

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!