zoukankan      html  css  js  c++  java
  • python3 第十九章

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

  • 相关阅读:
    arcgis10.2转shp文件中文乱码问题解决方案
    Android Context作为参数传递this
    andriod inputbox
    andriod inputType
    《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
    终于理解了什么是LGPL
    产品经理如何与强势的技术沟通? 技术比较有资历,会以技术无法实现等方面的原因拒绝处理产品提出的需求。 你们是否遇到这样的技术? 产品懂技术的话,是不是会好一些,因为可以和技术说“行话”了,并且产品懂技术就不会被忽悠了。
    Core Dump总结
    LIBRARY_PATH是编译时候用的,LD_LIBRARY_PATH是程序运行是使用的
    如何禁止C++默认成员函数
  • 原文地址:https://www.cnblogs.com/mrbug/p/8326162.html
Copyright © 2011-2022 走看看