猫史档案馆


【Python作品分享】进制转换

用户:T_MKT小艺T_MKT小艺查看:10 回复:4 评论:10 创建时间:2021-08-24T19:20:27


【作品展示】

center_image

 

【作品介绍】

任意 2~36 进制间数字的转换

 

【作品源代码】

def jin_zhi_zhuan_huan(a, a0, b0):

    # 为了整齐使用换行,对程序无影响
    Number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 
    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    if a0 != 10:
        c = 0
        # 数字 / 字母对应的实际数字 × 该进制数的 i 次方
        # 注意获取 “a” 的倒数第 i 位时减 1
        for i in range(0, len(str(a)), 1):
            c += int(Number.index(str(a)[(len(str(a)) - i - 1)]) * a0 ** i)
    else:
        c = a
    if b0 != 10:
        back = []
        bei_chu_shu = c
        # 重复执行直到被除数等于 0
        while bei_chu_shu != 0:
            # 寻找对应的字母 / 数字
            back.insert(0, Number[int(bei_chu_shu % b0)])
            # 被除数等于被除数减余数除以进制,这里直接用向下舍入代替,向下舍入用int代替
            bei_chu_shu = int(bei_chu_shu / b0)
        d = ''
        # 连接起来
        for i in range(0, len(back), 1):
            d += str(back[i])
    else:
        d = c
    return d

while True:
    a = int(input('什么数字?(不支持小数)'))
    try:
        b = int(input('这个数字是什么进制?'))
    except ValueError:
        print('请输入 2~36 的整数')
        continue
    else:
        # 确保在 2 ~ 36 内
        if not b in range(2, 37):
            print('请输入 2~36 的整数')
            continue
    try:
        c = int(input('要转换成什么进制?'))
    except ValueError:
        print('请输入 2~36 的整数')
        continue
    else:
        if not b in range(2, 37):
            print('请输入 2~36 的整数')
            continue
    print(jin_zhi_zhuan_huan(a, b, c))
    # 记得int
    if int(input('按 0 继续,按 1 退出')) == 1:
        print(end=None)
    else:
        print('')
        import time
        time.sleep(2)

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
KIHIOKIHIO

我也有一个2~16进制转化器:

def main():
    try:
        j1=float(input('请输入被转化数字的进制数:'))
    except ValueError:
        print('输入错误,程序已停止运行。')
        return 0
    try:
        j2=float(input('请输入已转化数字的进制数:'))
    except ValueError:
        print('输入错误,程序已停止运行。')
        return 0
    if int(j1)!=j1 or int(j2)!=j2:
        print('输入错误,程序已停止运行。')
        return 0
    j1=int(j1)
    j2=int(j2)
    if (j1>16 or j2<2) or (j1<2 or j2>16):
        print('输入错误,程序已停止运行。')
        return 0
    n=input('请输入被转化数字:')
    i=0
    aa=['a','b','c','d','e','f']
    bb=[10,11,12,13,14,15]
    ts=[]
    for i in range(0,len(n)):
        s=0
        try:
            cs=int(n[i])
        except ValueError:
            s=1
        if s==0:
            ts.append(int(n[i]))
        else:
            j=0
            fl=0
            for j in range(0,6):
                if aa[j]==n[i]:
                    fl=1
                    break
            if fl==1:
                ts.append(bb[j])
            else:
                print('输入错误,程序已停止运行。')
                return 0
        if ts[i]>=j1:
            print('输入错误,程序已停止运行。')
            return 0
    s1=0
    for i in range(0,len(ts)):
        s1+=ts[i]*(j1**(len(ts)-1-i))
    if s1==0:
        s2yd=[0]
    else:
        s2yd=[]
    while s1>0:
        s2yd.append(s1%j2)
        s1=int(s1/j2)
    i=len(s2yd)-1
    s2y=[]
    while i>=0:
        s2y.append(s2yd[i])
        i-=1
    s2=' '
    for i in range(0,len(s2y)):
        if s2y[i]<10:
            if s2==' ':
                s2=str(s2y[i])
            else:
                s2=s2+str(s2y[i])
        else:
            if s2==' ':
                s2=aa[s2y[i]-10]
            else:
                s2=s2+aa[s2y[i]-10]
    print('已转化数字:'+s2)
    return 0

x=main()

点赞0


评论


KIHIOKIHIO

你这个有BUG,被转化数字不支持输入字母,因为你把被转化数字用int()来转化,现在你不应该这样

点赞0


评论


T_MKT小艺T_MKT小艺

新代码

def jin_zhi_zhuan_huan(a, a0, b0):

    # 为了整齐使用换行,对程序无影响
    Number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 
    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    if a0 == b0:    # 相同直接转换
        return a
    if a0 != 10:
        c = 0
        # 数字 / 字母对应的实际数字 × 该进制数的 i 次方
        # 注意获取 “a” 的倒数第 i 位时减 1
        for i in range(0, len(str(a)), 1):
            c += int(Number.index(str(a)[(len(str(a)) - i - 1)]) * a0 ** i)
    else:
        c = a
    if b0 != 10:
        back = []
        bei_chu_shu = c
        while bei_chu_shu != 0:     # 重复执行直到被除数等于 0
            back.insert(0, Number[int(bei_chu_shu % b0)])    # 寻找对应的字母 / 数字
            # 被除数 = (被除数 - 余数) / 进制,这里直接用向下舍入(int)代替
            bei_chu_shu = int(bei_chu_shu / b0)
        d = ''
        # 连接起来
        for i in range(0, len(back), 1):
            d += str(back[i])
    else:
        d = c
    return d

while True:
    try:
        a = input('什么数字?(不支持小数)').upper()
    except ValueError:
        for i in range(0, len(a), 1):
            if not (a[i] in Number):
                print('请输入正确的整数')
                continue
    try:
        b = int(input('这个数字是什么进制?'))
    except ValueError:
        print('请输入 2~36 的整数')
        continue
    else:
        # 确保在 2 ~ 36 内
        if not b in range(2, 37):
            print('请输入 2~36 的整数')
            continue
    try:
        c = int(input('要转换成什么进制?'))
    except ValueError:
        print('请输入 2~36 的整数')
        continue
    else:
        if not b in range(2, 37):
            print('请输入 2~36 的整数')
            continue
    print(jin_zhi_zhuan_huan(a, b, c))
    # 记得int
    if int(input('按 0 继续,按 1 退出')) == 1:
        break
    else:
        print('')
        import time
        time.sleep(2)
print(end='')

点赞0


评论


KIHIOKIHIO

2~36进制互相转化程序代码(支持小数,已转化数字的精确程度有上限,不过还是相对比较精确的):

def main():
    fml=['0','1','2','3',
    '4','5','6','7',
    '8','9','aA','bB',
    'cC','dD','eE','fF',
    'gG','hH','iI','jJ',
    'kK','lL','mM','nN',
    'oO','pP','qQ','rR',
    'sS','tT','uU','vV',
    'wW','xX','yY','zZ']
    try:
        j1=float(input('请输入被转化数字的进制数:'))
    except ValueError:
        print('输入错误。')
        return 0
    if int(j1)!=j1:
        print('输入错误。')
        return 0
    j1=int(j1)
    if j1>36 or j1<2:
        print('输入错误。')
        return 0
    try:
        j2=float(input('请输入已转化数字的进制数:'))
    except ValueError:
        print('输入错误。')
        return 0
    if int(j2)!=j2:
        print('输入错误。')
        return 0
    j2=int(j2)
    if j2>36 or j2<2:
        print('输入错误。')
        return 0
    num=input('请输入被转化数字:')
    i1=0
    i2=0
    ofa=0
    num1=[]
    num2=[]
    if len(num)==0:
        print('输入错误。')
        return 0
    for i1 in range(0,len(num)):
        if num[i1]=='.':
            if i1==0 or i1==len(num)-1:
                print('输入错误。')
                return 0
            ofa+=1
            if ofa>=2:
                print('输入错误。')
                return 0
        else:
            ftla=0
            for i2 in range(0,36):
                if len(fml[i2])==1:
                    if fml[i2]==num[i1]:
                        ftla=1
                        break
                else:
                    if (fml[i2])[0]==num[i1] or (fml[i2])[1]==num[i1]:
                        ftla=1
                        break
            if ftla==1:
                if i2>=j1:
                    print('输入错误。')
                    return 0
                if ofa==0:
                    num1.append(i2)
                else:
                    num2.append(i2)
            else:
                print('输入错误。')
                return 0
    s1=0
    for i1 in range(0,len(num1)):
        s1+=num1[i1]*(j1**(len(num1)-1-i1))
    for i1 in range(0,len(num2)):
        s1+=num2[i1]*(1/(j1**(i1+1)))
    s1a=int(s1)
    s1b=s1-s1a
    pres2a=[]
    pres喵=[]
    if s1a==0:
        pres2a=[0]
    while s1a>0:
        pres2a.append(s1a%j2)
        s1a=s1a//j2
    pres2a.reverse()
    i1=1
    while s1b>0.0000000001:
        k=int(s1b/(1/(j2**i1)))
        pres喵.append(k)
        s1b-=(k*(1/(j2**i1)))
        i1+=1
    s2a=' '
    s喵=' '
    for i1 in range(0,len(pres2a)):
        if s2a==' ':
            s2a=(fml[pres2a[i1]])[0]
        else:
            s2a=s2a+((fml[pres2a[i1]])[0])
    for i1 in range(0,len(pres喵)):
        if s喵==' ':
            s喵=(fml[pres喵[i1]])[0]
        else:
            s喵=s喵+((fml[pres喵[i1]])[0])
    if s喵==' ':
        print('已转化数字:'+s2a)
    else:
        print('已转化数字:'+s2a+'.'+s喵)

ms=main()

点赞0


评论