"""
进行n进制到n进制的进制转换
"""
dict1 = {10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "E", 16: "F"}
dict2 = dict()
for key, value in dict1.items():
dict2[value] = str(key) # 键值交换,并全换成字符串类型
def changer_n_to_n(num, origin, target=10):
lst_num0 = list(str(num)) # 把字符串打成列表,方便修改
for i in range(len(lst_num0)):
if lst_num0[i] in dict1.values():
lst_num0[i] = dict2.get(lst_num0[i])
# 把字母换掉,全都是数字才能进一步运算
dec_int = 0
for i in range(len(lst_num0)):
dec_int += int(lst_num0[i]) * (int(origin) ** (len(lst_num0) - i - 1))
# 这里是,对一个不确定是不是十进制的数字,每一位乘以 进制的索引次方,加和得到十进制结果
divisor = dec_int # 整除
result = list() # 用于存储结果
while divisor != 0:
reminder = divisor % target # 取余计数
if 10 <= reminder <= 16:
reminder = dict1[reminder]
result.append(str(reminder))
divisor = divisor // target # 整除用于下一次计算
result.reverse()
return result
# 其实就是把上两个工程文件里的函数叠一块……先统一到10进制dec,然后再往下走
def printer_all(num, origin): # 用来打印出所有2-16进制转换结果
for target in range(2, 17):
if target <= 9: # 这个纯粹是为了看着好看一点,后面数字是每一位对齐的
print(" ", end="")
print(f" {target}进制 结果为:{' '.join(changer_n_to_n(num, origin, target))}")
num0_str = input("\n请输入想要进行进制转换的原数字(非负整数,10-15的数字用大写英文字母A-F表示):")
origin_str = input("数字在转换前是几进制?(阿拉伯数字,当前仅支持2-16进制。若为10进制可不填)",)
# 这两个因为都有可能是空字符串,所以先不要套int,int("")会报错的
if origin_str == "":
origin_str = "10" # 如果用户没有输入,自动补上"10"
target_str = input("您希望转换到几进制?(范围同上,如果想要查看2-16所有进制转换结果可不填)")
if target_str != "": # 只要求转换到一种进制
target_int = int(target_str)
print(f"\n{origin_str}进制转换到到{target_int}进制 转换结果为:\
{' '.join(changer_n_to_n(num0_str, origin_str, target_int))}")
else:
print(f"\n{origin_str}进制转换到")
printer_all(num0_str, origin_str) # 把所有结果都打印出来
尝试写了2-16进制内相互转换的代码
但是是先把n转到10再转到目标n,可能效率不够高