'''
说明:目前只能在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()
# 想法:是否使用进制转化器?是,则一直使用