程序功能:利用Python实现任意进制转换器

主要以十进制作为桥梁,利用m进制转十进制,十进制转n进制实现m进制到n进制的转换。

1、m进制转十进制

从最低位(最右)算起,位上的数字乘以本位的权重,加和即得到十进制数。比如101.001(2),转十进制为 

                                    

educoder中python将10进制转化为二进制 python将10进制转换为n进制_进制

2、十进制转n进制

           整数部分利用短除法

                                                                

educoder中python将10进制转化为二进制 python将10进制转换为n进制_System_02

            

            小数部分利用乘以进制减至1以内的方法,具体说明见十进制转二进制,虽然其中讲的是二进制,但其实对任意进制都适用,只需将2更换为其他数字即可。

            我们先将输入的实数以小数点为界拆开, 对两部分加在一起即可

3、其他功能

            还添加了转换负数的功能,不过不是补码,单纯的是绝对值的转换再加一个负号而已。

            此外,由于十进制转n进制时,并不一定可以使乘上权重的结果为整数,会造成死循环,因此加了一个循环时间限制,防止死循环。为了使结果可读性增加,转化结果超过十位小数时,自动保留十位小数。

            以下为代码(设置最高为十六进制,若有更高需求添加waitNumber列表中的字母即可):

#By 青山如墨落画卷
#1、十六进制以内实数任意进制对任意进制的转换
#2、小数位数超过十位保留十位小数
#3、包含负数的转换(是数值的转换而不是补码)
#4、能够实现更高进制的转换:直接增加waitNumber中的字母数量
#算法:其他进制转十进制:对应位相乘.十进制转其他进制:整数部分短除法,小数部分利用乘n取整,顺序排列
import time as t
waitNumber=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]
def demicalSystemToOthers(Number,System):
    """
    输入:十进制数及目标进制
    输出:目标进制数
    """
    intergerList=[]
    decimalList=[]
    result=""
    decimal=Number-int(Number)
    interger=int(Number)
    #整数部分短除法
    while interger>=System:
        intergerList.append(waitNumber[interger%System])
        interger=interger//System
    intergerList.append(waitNumber[interger])
    #小数部分乘2取整
    start=t.perf_counter()
    while decimal!=0:
        decimal*=System
        decimalList.append(waitNumber[int(decimal//1)])
        decimal-=decimal//1
        #如果转化过程中有死循环,则跳出
        if t.perf_counter()-start>=0.001:
            break
    #将储存数字的列表转换成结果
    for k in range(len(intergerList)):
        result+=str(intergerList.pop(-1))
    if decimalList!=[]:
        result+="."
        for k in decimalList:
            result+=str(k)
    return result

def othersToDemicalSystem(NumberandSystem,System):
    """
    输入:数字及其进制
    输出:转换为十进制
    """
    result=0
    interger=NumberandSystem[0].split(".")[0]
    #判断是否有小数部分
    try:
        decimal=NumberandSystem[0].split(".")[1]
    except:
        decimal="0"
    #将整数与小数部分分别转换为十进制(乘以对应位权)
    for i in range(len(interger)):
        result+=waitNumber.index(interger[i])*(System**(len(interger)-i-1))
    for j in range(len(decimal)):
        result+=waitNumber.index(decimal[j])*(System**(-j-1))
    return result
3
def main():
    numberAndPreviousSystem=input("请输入要转换的数及其进制(用空格分开):").split(" ")
    LaterSystem=int(input("请输入转换后的数的进制:"))
    #判断是否是负数
    symbol=""
    if numberAndPreviousSystem[0][0]=="-":
        numberAndPreviousSystem[0]=numberAndPreviousSystem[0][1:]
        symbol+="-"
    previousSystem=int(numberAndPreviousSystem[1])
    intermediateNumber=othersToDemicalSystem(numberAndPreviousSystem,previousSystem)
    resultNumber=demicalSystemToOthers(intermediateNumber ,LaterSystem)
    #若小数位数不足十位直接输出,否则输出十位小数
    try:
        print(symbol+resultNumber[:resultNumber.index(".")+11]+"("+str(LaterSystem)+")")
    except:
        print(symbol+resultNumber+"("+str(LaterSystem)+")")
main()