任意进制转任意进制(62进制以内)

 e3e18ed7f0e442aeb3b249e0da88efbd.png

'''
说明:目前只能在62进制内转化
十六进制:0~F(大写F)
六十二进制:0~z(小写z)
'''


import random
# 输入
n = input("请输入一个数:")
r = int(input("该数是几进制:"))
x,t,y = n.partition(".")
lengthx = len(x)
lengthy = len(y)

# 判断输入是否正确
d1 = {0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F', 16: 'G', 17: 'H', 18: 'I', 19: 'J', 20: 'K', 21: 'L', 22: 'M', 23: 'N', 24: 'O', 25: 'P', 26: 'Q', 27: 'R', 28: 'S', 29: 'T', 30: 'U', 31: 'V', 32: 'W', 33: 'X', 34: 'Y', 35: 'Z',36:"a",37:"b",38:"c",39:"d",40:"e",41:"f",42:"g",43:"h",44:"i",45:"j",46:"k",47:"l",48:"m",49:"n",50:"o",51:"p",52:"q",53:"r",54:"s",55:"t",56:"u",57:"v",58:"w",59:"x",60:"y",61:"z"}
d2 = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18, 'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26, 'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35,"a":36,"b":37,"c":38,"d":39,"e":40,"f":41,"g":42,"h":43,"i":44,"j":45,"k":46,"l":47,"m":48,"n":49,"o":50,"p":51,"q":52,"r":53,"s":54,"t":55,"u":56,"v":57,"w":58,"x":59,"y":60,"z":61}


def cheek(r,n):  # r:表示进制数。n:表示数(如:"1234")用来判断是否符合
    if not n:   # 如果n为空,则输入成立,因为使用str.partition("."),若无小数则为空
        s = 1
    else:
        for i in n:
            if d2.get(i)<r:
                s = 1
            else:
                s = 0
                break
    return s
# 当s=0时表示:输入错误


s1 = cheek(r,x)
s2 = cheek(r,y)
if s1==0 or s2==0:
    print("请输入正确的{0}进制数(形如:{1})".format(r,d1.get(random.randint(0,r-1))+d1.get(random.randint(0,r-1))))
    print("---------------------------------------")
# 如果输入错误则重新输入!
while s1==0 or s2==0:
    n = input("请重新输入一个数:")
    r = int(input("该数是几进制:"))
    x,t,y = n.partition(".")
    s1 = cheek(r,x)
    s2 = cheek(r,y)
    if s1==0 or s2==0:
        print("请输入正确的{0}进制数(形如:{1})".format(r,d1.get(random.randint(0,r-1))+d1.get(random.randint(0,r-1))))
        print("---------------------------------------")
        continue
    break
R = int(input("您打算转为几进制:"))  # 如果输入正确,再进一步询问

# 以十进制为中间桥梁,R————decimal————R
sum = 0
if r!=10:
    countx = 0
    county = -1
    for i in x:
        i = d2.get(i)
        sum+=int(i)*r**(lengthx-1-countx)
        countx+=1
    for j in y:
        j = d2.get(j)
        sum+=int(j)*r**(county)
        county-=1
else:
    if y and x:
        sum = int(x) + int(y)*10**(-lengthy)
    elif x:
        sum = int(x)
    else:
        sum = int(y)*10**(-lengthy)

# 将整数部分转化为R进制 注:此时sum=12.33为十进制,type(sum)=float or int
sum = str(sum)
sum,t,float_y = sum.partition(".")
length_float = len(float_y)
sum = int(sum)   # 此时sum只表示整数部分,小数部分独立开来,小数部分是y
int_l = []
if sum==0:
	int_l = [0]
else:
    while sum:
        j = sum%R
        sum = sum//R
        int_l = [j]+int_l      # 辗转相除法将十进制转化为R进制

# 小数部分转化为R进制
float_l = []
if y:
    answer = input("您需要保留小数吗(y/n):")
    if answer.lower()=="y":
        c = int(input("保留几位小数:"))
    else:
    	c = 0
else:
	c = 0

float_count = 0 # 用来表示保留几位小数
if c==0:   # 保留零位小数
	float_l = []
else:
    float_y = int(float_y)*10**(-length_float)
    while float_count<c:
        j = int(float_y*R)
        float_y = (float_y*R)-j
        float_l = float_l+[j]
        float_count+=1

# 输出
print("将{}进制数{}转化为{}进制为:".format(r,n,R))
for j in int_l: 
    j = d1.get(j)
    print(j,end="")

if c!=0:   # C表示是否保留小数
    print(".",end="")
    for i in float_l:
        i = d1.get(i)
        print(i,end="")
print()
# 想法:是否使用进制转化器?是,则一直使用

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值