• python数据结构:进制转化探索


    *********************************第一部分*******************************************************************
    ***********************************************************************************************************************
    # 输入excel的行号,输出对应列的序号(从0开始编号)
    # 相当于:26进制用a-z表示,将其转化为10进制,即:输入a输出0,输入b输出1,输入aa输出26.。。。
    strs = input('请输入1-2个字母组成的字符串:').lower()
    list_char = list(strs)
    sum = 0
     
    def sub_str(str_a, str_b):
      return ord(str_a)-ord(str_b)
     
     
    for index, str in enumerate(list_char[::-1]):
      sum += (sub_str(str, 'a')+1) * 26 ** index
     
    print(sum-1)
    print(list_char[::-1])
     
    *********************************第二部分*******************************************************************
    ***********************************************************************************************************************
    题目解读:
    即 A=0,Z=25
    则Z-A=25
    根据进制换算,得到以下公式:
    A = (A-A+1)*26^0 -1 = 0
    Z = (Z-A+1)*26^0 -1 = 25
    AA = (A-A+1)*26^1 + (A-A+1)*26^0 -1 = 26
    AZ = (A-A+1)*26^1 + (Z-A+1)*26^0 -1 = 51
    BA = (B-A+1)*26^1 + (A-A+1)*26^0 -1 = 52
    ZA = (Z-A+1)*26^1 + (A-A+1)*26^0 -1 = 26*26=676
    ...............
    ZBFA = (Z-A+1)*26^3 + (B-A+1)*26^2 + (F-A+1)+26^1 + (A-A+)*26^0 -1
     
    如果输入:ZA,那么list_char = ['Z','A'],索引为0,1
    enumerate(list_char[::-1]反转了列表,即['A','Z'],目的是反转索引
     
     
    *********************************第三部分*******************************************************************
    ***********************************************************************************************************************
    那么,下面由这种方法,将十六进制输出为十进制
    #!/usr/bin/env/python35
    # -*- coding:utf-8 -*-
    # author: Keekuun
     
    # 16进制就是逢16进1
    def distance(num1, num2):
    # 求与第一个数(0)的距离
    if ord(num1) >= 65:
    # 输入的是A,B,C,D,E
      return ord(num1) - ord(num2) - 7
    else:
    # 输入的是0-9
      return ord(num1) - ord(num2)
      
    def sixteen_to_ten(num):
      result = 0
      for index, value in enumerate(num[::-1]):
    # 分别将各个位数转化为10进制,然后求和
        result += distance(value, str('0')) * 16 ** index
      # print('result=%s'%result)
      return result
     
    num = list(input('请输入16进制数(不添加0x):').upper())
    print(sixteen_to_ten(num))
     
     
    *********************************第四部分**************************************************************************
    ***********************************************************************************************************************
    • 十进制:decimal system,每一位最高为9,达不到10

    • 二进制:binary system,每一位最高为1,达不到2

    • 八进制:octonary number system,每一位最高为7,达不到8

    • 十六进制:hexadecimal,每一位最高为 1515 或者 0xf0xf,取不到16(那就是0xG0xG了,:-D)。

    推论:

    • 如果一个数为25,则它的进制不低于6进制;

    • 自然也可以这样理解,如果一个数的某一位的取值范围为 [0,m1][0,m−1],则该数即为 mm进制;

    >>> 0b1010
    10 
                # 也即python原生语法是支持二进制表示
    >> 0xff
    255
                # 自然也支持八进制

    向十进制转换

    int(string, base)
                # 第一个参数标识:需要转换的原始的数据,以字符串的形式表示
                # 第二个参数标识:原始数据的base或者叫本身的进制表示
                # 2:二进制
                # 8:八进制
                # 16:表示16进制
                # 最终转化为十进制

    二进制 ⇒ 十进制

    >>> int('1010', 2)
    10

    十六进制 ⇒ 十进制

    >>> int('f', 16)
    15
    >>> int('0xf', 16)
    15
    >>> int('0xff', 16)
    255

    八进制 ⇒ 十进制

    >>> int('17', 8)
    15  
                # 15 = 7*8^0+1*8^1

    向16进制转化

    hex(string)
                # 也即没有进制的设置
                # 只接受10进制
                # 为实现其他进制的转换,可先转换为十进制使用int()
                # 返回位字符串类型
    >>> hex(1033)
    '0x409'
    
    >>> hex(int('101010', 2))
    '0x2a'
    
    >>> hex(int('17', 8))
    '0xf'

    向二进制转换

    bin(十进制整型)
    >>> bin(10)
    '0b1010'
    
    >>> bin(int('ff',16))
    '0b11111111'
    
    >>> bin(int('17',8))
    '0b1111'

    向八进制转换

    oct()
                # 不同于hex/bin
                # 通过参数进行判断
                # 其是二进制、十进制、16进制
                # 也即oct函数可将任意进制的数转换为8进制
    >>> oct(0b1010)
    '012'
    >>> oct(11)
    '013'
    >>> oct(0xf)
    '017'

    向 m进制 的转换

    不断的对m求模取余,余数为当前位(低位向高位),商新的被除数,支持商为0。

    例,我们以十进制的25向3进制转换;

    25/3 ⇒ 8(1) 
    8/3 ⇒ 2(2) 
    2/3 ⇒ 0(2)

    则25的三进制表示为 221130+231+232=251⋅30+2⋅31+2⋅32=25

    def base(x, m):
        ms = []
        while x:
            ms.append(x%m)
            x //= m
                        # python 3
                        # //:表示整除,保留整数部分
                        // /:得float类型
        return ms
     
    明月装饰了你的窗子,你装饰了他的梦。
  • 相关阅读:
    Vue.js入门(3)TypeScript
    Dapper源码学习
    .Net中手动实现AOP
    .Net面向对象(OOP)
    Redis实战(18)Redis位图巧用,节约内存
    .Net深拷贝浅拷贝
    .NET面试题系列(22)字符串暂存池(缓冲池)
    .NET面试题系列(二十一)C#中Equals和==的比较
    C# 8.0
    C# 7.0
  • 原文地址:https://www.cnblogs.com/zkkysqs/p/9175209.html
Copyright © 2020-2023  润新知