我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是:
- 整数部分,除基取余,逆序排列
- 小数部分,乘基取整,顺序排列
- 负数,按绝对值处理
好,假设我们需要转化的数都是正整数,那这个函数可以这样写:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数': # 0〜36的数的表示 index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] res = "" # 用来存储结果 while num >= base: num1 = num // base # 商 num2 = num % base # 余数 num = num1 res = str(index[num2]) + res else: res = str(num) + res return res
添加调用函数的代码:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数': # 0〜36的数的表示 index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] res = "" # 用来存储结果 while num >= base: num1 = num // base # 商 num2 = num % base # 余数 num = num1 res = str(index[num2]) + res else: res = str(num) + res return res num = input('请输入一个十进制数,并按回车:') # 十进制数 num = int(num) base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制 base = int(base) print(Convert1(num, base))
运行代码,分别输入100回车、26回车,程序输出:
请输入一个十进制数,并按回车:100 请输入一个2 ~ 36的数字表示进制,并按回车:26 3M
通过在线验证工具:http://tool.oschina.net/hexconvert/ 验证正确。
现在,假设我们需要转化的数都是 0〜1 之间的小数:
def Convert2(num:'0到1之间的十进制的数', base:'转换为这个进制的数')->'转化之后的数': # 0〜36的数的表示 index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] res = "0." # 用来存储结果 while (num < 1) & (num >0): num1 = num * base # 积 num2 = int(num1 // 1) # 取整 num = num1 - num2 res += str(index[num2]) if len(res) >10: # 只保留8位 break return res num = input('请输入一个十进制数,并按回车:') # 十进制数 num = float(num) base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制 base = int(base) print(Convert2(num, base))
思考:假如在while中不做位数判断会出现什么情况?
接下来我们只要把整数部分和小数部分的组合起来,就可以得到最终的函数:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数': # 0〜36的数的表示 index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] res = "" # 用来存储结果 while num >= base: num1 = num // base # 商 num2 = num % base # 余数 num = num1 res = str(index[num2]) + res else: res = str(num) + res return res def Convert2(num:'0到1之间的十进制的数', base:'转换为这个进制的数')->'转化之后的数': # 0〜36的数的表示 index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] res = "." # 用来存储结果 , 没合并时这里是 0. 想一想现在为什么要改成 . while (num < 1) & (num >0): num1 = num * base # 积 num2 = int(num1 // 1) # 取整 num = num1 - num2 res += str(index[num2]) if len(res) >10: # 只保留8位 break return res def Convert(num, base): """ :param num:十进制数 :param base: 要转换为这个进制 :return: 返回转换后的数 """ numConvert = abs(num) # 得到num的绝对值 num1 = int(numConvert // 1) # 得到整数部分 num2 = numConvert - num1 # 得到小数部分 if num2 == 0: res = Convert1(num1, base) else: res = Convert1(num1, base) + Convert2(num2, base) return res # 调用函数 num = input('请输入一个十进制数,并按回车:') # 十进制数 num = float(num) base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制 base = int(base) print(Convert(num, base))
至此,函数就写好了,但是我们发现,这个函数并不完美,因为,我们必须保证输入的10进制数字是正确的,否则函数会报错,请思考:如何用前些章学过的知识改进函数,使用当用户输入不正确的格式时提示用户重新输入? 后面的章节里,我们再来讲如何处理这种情况。