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


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

查看所有标签

猜你喜欢:

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

计算理论导引

计算理论导引

[美]Michael Sipser / 张立昂、王捍贫、黄雄 / 机械工业出版社 / 2000-2 / 30.00元

本书由计算理论领域的知名权威Michael Sipser撰写。他以独特的视角,综合地描述了计算机科学理论,并以清新的笔触、生动的语言给出了宽泛的数学理论,而并非拘泥于某些低层次的技术细节。在证明之前,均有“证明思路”,帮助读者理解数学形式下蕴涵的概念。同样,对于算法描述,均以直观的文字,而非伪代码给出,从而将注意力集中于算法本身,而不是某些模型。本书的内容包括三个部分:自动机与语言、可计算性理论和一起来看看 《计算理论导引》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具