python3 第十九章 - 写一个10进制转任意进制的函数

栏目: Python · 发布时间: 6年前

内容简介:python3 第十九章 - 写一个10进制转任意进制的函数

我们先回忆下之前所学的进制转换的知识(详见:第十章),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进制数字是正确的,否则函数会报错, 请思考:如何用前些章学过的知识改进函数,使用当用户输入不正确的格式时提示用户重新输入?   后面的章节里,我们再来讲如何处理这种情况。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming From The Ground Up

Programming From The Ground Up

Jonathan Bartlett / Bartlett Publishing / 2004-07-31 / USD 34.95

Programming from the Ground Up is an introduction to programming using assembly language on the Linux platform for x86 machines. It is a great book for novices who are just learning to program as wel......一起来看看 《Programming From The Ground Up》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试