当前位置:首页>python>python算法案例100-10(进制转换)

python算法案例100-10(进制转换)

  • 2026-10-23 02:43:35
python算法案例100-10(进制转换)

python算法案例100-10(数制转换)

1.问题描述

       给定一个M进制的数x,实现对x向任意一个非M进制的数的转换。

2. 问题分析

       掌握不同数制间的转换关系是解决本题的关键,这里所说的数制一般包括二进制、八进制、十六进制及十进制。除了不同的数制之外,还有几个必须要了解的概念:

  • 基数:在一种数制中,只能使用一组固定的数字来表示数的大小。具体使用多少个不同的数字来表示一个数值的大小,就称为该计数制的基数(Base)。如十进制的基数为10、二进制的基数为2等。

  • 权:又称为位权或权值,即每一个数位都有一个固定的基值与之相对应。如十进制的个位对应的权值为1(100 ),十位对应的权值为10(101 ),百位对应的权值为100(102 ),对于一个M进制的数来说,小数点左边各位上对应的权值从左到右分别为基数的0次方、基数的1次方、基数的2次方等,对于小数点右边各位上对应的权值从右到左分别为基数的-1次方、基数的-2次方等。

二进制、八进制、十六进制向十进制转换的方法为:

按权展开相加。

十进制转换成二进制、八进制、十六进制的方法为:

整数部分除以基数取余数(取余的方向为从后向前),小数部分乘以基数取整数(取整的方向为从前向后)。

二进制、八进制、十六进制相互转换的方法为:

先转换成十进制再转换成其他进制;
       或者按照其对应关系进行转换(3位二进制数对应一位八进制数,4位二进制数对应一位十六进制数)。
本题按照前一种转换方式进行编程。

3. 算法设计

       十六进制是由0~F这一组固定的数字来表示的,所以采用字符数组进行存储。在进行输入、输出时,数组元素都是以字符的形式存在的,但是在进行数制转换时数组元素又以数字的形式存在,程序中我们用两个自定义函数char_to_number()及number_to_char()来实现字符与其对应数字之间的转换。

       在执行程序时我们希望可以输入多组数据来验证程序的正确性,以前的程序都是多次运行,输入不同的数据来实现。我们对程序稍做改进,使只运行一次程序但可以输入多组数据进行验证。解决这个问题只需要加一层循环,如果循环条件为真则继续输入数据,否则退出。循环条件为真即表达式的值不为0,这样我们可以利用一个变量假设为flag,利用语句“while flag:循环体”来进行控制,当flag的值为1时我们可以接着输入,若为0则结束循环。

4.确定程序框架

程序主体框架如下:

if __name__ == '__main__':
    MAXCHAR = 101# 允许的最大字符串长度
    flag = 1# 存储是否退出程序的标志
while flag: # 利用输入的flag值控制循环是否结束
# 将原数转换成十进制数
# 求出转换成目标数制后字符数组的长度
# 逆序打印字符数组
print("继续请输入1,否则输入0:")
flag = int(input())

5.字符与数字进行转换

       将输入或存储的字符转换为对应的数字,可以分两类进行考虑:第一类是介于’0’到’9’之间的字符,转换成相应的数字0~9时,可利用其ASCII码之间的对应关系。字符’0’的ASCII码为48,’1’的ASCII码为49,’1’-‘0’=1(在0~127之间字符型与整型是可以通用的)得到的差即为字符ch对应的数字。第二类是介于’A’到’Z’之间的字符,字符’A’对应的数字为10,’B’对应的数字为11,其他字母以此类推。

       值得高兴的是,Python为我们提供了以下函数,用于实现数字、字母和字符之间的转换。

  • int(x)
    :将其他类型转换成数字。
  • ord(x)
    :将字符转换成对应的Unicode码。
  • str(x)
    :将其他类型转换成字符串。
  • chr(x)
    :将十进制数字转换成对应的字符。

将字符转换成数字,代码如下:

# 将字符转换成数字def char_to_num(ch):    if '0' <= ch <= '9':        return int(ch)    elif 'A' <= ch <= 'Z':        return ord(ch) - ord('A') + 10    elif 'a' <= ch <= 'z':  # 建议支持小写        return ord(ch) - ord('a') + 10    else:        raise ValueError("Invalid digit")# 将数字转换为字符def num_to_char(num):    if num >= 0 and num <= 9:        return str(num) # 将0~9之间的数字转换成字符    else:        return chr(num) # 将大于10的数字转换成字符

6.其他数制转换成十进制

       其他数制转换成十进制,采用按权展开相加的方法,所以需要定义一个变量来存储相加之后的和,假设变量为decimal_num。因数组元素类型为字符型,所以首先需要调用char_to_num(temp[i])函数将元素类型转化成数值型然后参与运算。

定义source_to_decimal()函数来完成数值转换,该函数代码如下:

# 其他数制转换为十进制
defsource_to_decimal(temp, source):
    decimal_num = 0# 存储展开之后的和
for i inrange(len(temp)): # 累加
        decimal_num=(decimal_num * source)+char_to_num(temp[i])
return decimal_num

7.十进制转换成其他数制

       十进制转换成其他数制,采用除以基数取余的方法。以十进制转换成八进制为例,首先用当前的十进制数除以要转换成的数制的基数8,得到的余数存放在数组元素decimal中,为了使余数的类型由数值型转换成字符型,需调用num_to_char(decimal_num%object)函数,将相除之后的十进制数再次赋值给存储原数据的变量decimal_num;然后用得到的新十进制数再去除基数,将余数转换成字符型存入decimal数组中;一直重复上述过程,直到原来的十进制数为0。

定义函数decimal_to_object()来实现上述功能,其代码如下:

# 十进制转换为其他数制
defdecimal_to_object(decimal_num, object):
    decimal = []
while decimal_num:
# 求出余数并转换为字符
        decimal.append(num_to_char(decimal_num % object))
        decimal_num //= object# 用十进制数除以基数
return decimal

由余数组成的新数制数与余数的顺序是相反的,所以在输出新数的时候我们采用的是逆序输出的方式,定义output()函数用于完成新数的输出,代码如下:

defoutput(decimal):
    f = len(decimal)-1
while f >= 0:
print(decimal[f], end='')
        f -= 1
print()

8.完整的程序

# @desc: 数制转换
# 将字符转换成数字
defchar_to_num(ch):
    if'0' <= ch <= '9':
        returnint(ch)
    elif'A' <= ch <= 'Z':
        returnord(ch) - ord('A') + 10
    elif'a' <= ch <= 'z':  # 建议支持小写
        returnord(ch) - ord('a') + 10
    else:
        raise ValueError("Invalid digit")

# 将数字转换为字符
defnum_to_char(num):
    if num >= 0and num <= 9:
        returnstr(num) # 将0~9之间的数字转换成字符
    else:
        returnchr(num) # 将大于10的数字转换成字符

# 其他数制转换为十进制
defsource_to_decimal(temp, source):
    decimal_num = 0# 存储展开之后的和
for i inrange(len(temp)): # 累加
        decimal_num=(decimal_num * source)+char_to_num(temp[i])
return decimal_num

# 十进制转换为其他数制
defdecimal_to_object(decimal_num, object):
    decimal = []
while decimal_num:
# 求出余数并转换为字符
        decimal.append(num_to_char(decimal_num % object))
        decimal_num //= object# 用十进制数除以基数
return decimal

# 修改余数数制
defoutput(decimal):
    f = len(decimal)-1
while f >= 0:
print(decimal[f], end='')
        f -= 1
print()


if __name__ == '__main__':
MAXCHAR = 101# 允许的最大字符串长度
flag = 1# 存储是否退出程序的标志
while flag: # 利用输入的flag值控制循环是否结束
print("转换前的数是:", end='')
    temp = input()
print("转换前的数制是:", end='')
    source = int(input())
print("转换后的数制是:", end='')
object = int(input())
print("转换后的数是:", end=’’)
    decimal_num = source_to_decimal(temp, source)
    decimal = decimal_to_object(decimal_num, object)
    output(decimal)
# 继续请输入    否则输入 
print("继续请输入1,否则输入0:")
    flag = int(input())

9.运行结果

关键知识点总结

1. 进制的基本概念

  • 基数(Base)
    :表示该进制可用的数字个数(如二进制基数为2,十六进制为16)。
  • 权值(Weight)
    :每一位的数值 = 数字 × 基数^位置(从右往左,小数点左侧从0开始)。

2. 通用转换策略(两步法)

任意进制 A → 十进制 → 任意进制 B
这是本题采用的通用、可靠、易编程的方法,适用于所有进制(2~36常见范围)。

3. 字符与数字的双向映射

  • '0'-'9'
     ↔ 0-9
  • 'A'-'Z'
    (或 'a'-'z')↔ 10-35
  • Python 中通过 ord() / chr() 或直接判断实现,是处理十六进制等高进制的关键。

4. 算法核心函数

表格

函数
功能
char_to_num(ch)
字符 → 对应数值(如 'A' → 10)
num_to_char(num)
数值 → 对应字符(如 10 → 'A')
source_to_decimal(s, base)
任意进制字符串 → 十进制整数(按权展开)
decimal_to_object(n, base)
十进制整数 → 目标进制字符列表(除基取余)

5. 输入输出控制

  • 使用 while flag 实现多组测试数据,提升程序实用性。
  • 输出时需逆序打印余数数组(因取余顺序是从低位到高位)。

💡 一句话总结:
“任意进制互转 = 转十进制 + 十进制转目标进制”,核心在于字符与数值的正确映射和边界条件处理。

最新文章

随机文章