程序功能:利用Python实现任意进制转换器
主要以十进制作为桥梁,利用m进制转十进制,十进制转n进制实现m进制到n进制的转换。
1、m进制转十进制
从最低位(最右)算起,位上的数字乘以本位的权重,加和即得到十进制数。比如101.001(2),转十进制为
2、十进制转n进制
整数部分利用短除法
小数部分利用乘以进制减至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()