完整源代码项目地址,关注博主私信'源代码'后可获取
1.问题描述 2.问题分析 3.算法设计 4.确定程序框架 5.字符与数字进行转换 6.其他数制转换成十进制 7.十进制转换成其他数制 8.完整的程序
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:
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 ch >= '0' and ch <= '9' :
return int ( ch)
else :
return ord ( ch)
def num_to_char ( num) :
if num >= 0 and num <= 9 :
return str ( num)
else :
return chr ( num)
6.其他数制转换成十进制
其他数制转换成十进制,采用按权展开相加的方法,所以需要定义一个变量来存储相加之后的和,假设变量为decimal_num。因数组元素类型为字符型,所以首先需要调用*char_to_num(temp[i])*函数将元素类型转化成数值型然后参与运算。
定义source_to_decimal()函数来完成数值转换,该函数代码如下:
def source_to_decimal ( temp, source) :
decimal_num = 0
for i in range ( 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()来实现上述功能,其代码如下:
def decimal_to_object ( decimal_num, object ) :
decimal = [ ]
while decimal_num:
decimal. append( num_to_char( decimal_num % object ) )
decimal_num //= object
return decimal
由余数组成的新数制数与余数的顺序是相反的,所以在输出新数的时候我们采用的是逆序输出的方式,定义output()函数用于完成新数的输出,代码如下:
def output ( decimal) :
f = len ( decimal) - 1
while f >= 0 :
print ( decimal[ f] , end= '' )
f -= 1
print ( )
8.完整的程序
完整的程序如下:
% % time
def char_to_num ( ch) :
if ch >= '0' and ch <= '9' :
return int ( ch)
else :
return ord ( ch)
def num_to_char ( num) :
if num >= 0 and num <= 9 :
return str ( num)
else :
return chr ( num)
def source_to_decimal ( temp, source) :
decimal_num = 0
for i in range ( len ( temp) ) :
decimal_num= ( decimal_num * source) + char_to_num( temp[ i] )
return decimal_num
def decimal_to_object ( decimal_num, v_object) :
decimal = [ ]
while decimal_num:
decimal. append( num_to_char( decimal_num % v_object) )
decimal_num //= v_object
return decimal
def output ( decimal) :
f = len ( decimal) - 1
while f >= 0 :
print ( decimal[ f] , end= '' )
f -= 1
print ( )
if __name__ == '__main__' :
MAXCHAR = 101
flag = 1
while flag:
temp = input ( )
print ( f"转换前的数是: { temp} " , end= '\n' )
source = int ( input ( ) )
print ( f"转换前的数制是: { source} " , end= '\n' )
v_object = int ( input ( ) )
print ( f"转换后的数制是: { v_object} " , end= '\n' )
decimal_num = source_to_decimal( temp, source)
decimal = decimal_to_object( decimal_num, v_object)
print ( "转换后的数是:" , end= ' ' )
output( decimal)
print ( "继续请输入1,否则输入0:" )
flag = int ( input ( ) )
转换前的数是:15
转换前的数制是:16
转换后的数制是:10
转换后的数是: 21
继续请输入1,否则输入0:
转换前的数是:10
转换前的数制是:8
转换后的数制是:16
转换后的数是: 8
继续请输入1,否则输入0:
转换前的数是:85
转换前的数制是:10
转换后的数制是:8
转换后的数是: 125
继续请输入1,否则输入0:
转换前的数是:20
转换前的数制是:10
转换后的数制是:2
转换后的数是: 10100
继续请输入1,否则输入0:
CPU times: user 562 ms, sys: 165 ms, total: 726 ms
Wall time: 1min 21s