鱼C论坛

 找回密码
 立即注册
查看: 1625|回复: 3

[原创] 课后作业17讲:进制转换

[复制链接]
发表于 2022-9-2 22:19:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MaxFireGun 于 2022-9-2 22:21 编辑
num_dict = {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'}

symbol_dict = {'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}

### Number Conversion Program####

def Dec_to_Y(num, M, N):
    i = 0
    new_num = 0
    new_str = ''
    
    while True:
        if num < N:
            new_num += num * (10 ** i) 
            new_str = num_dict[num] + new_str
            # return (new_num, new_str)
            return (new_str)
        
        else:
            A = num % N
            new_num += A * 10 ** i
            new_str = num_dict[A] + new_str          
            num = num // N
            i += 1

def X_to_Dec(num, M, N):
    num = str(num)
    temp = 0
    num_len = len(num)
    j = 1
    for i in num:
        temp += symbol_dict[i] * (M ** (num_len - j))
        j += 1
    return (temp, M, N)
    

def X_to_Y(num, M, N):
    a = X_to_Dec(num, M, N)
    b = Dec_to_Y(*a)   
    return b        
        
##########################################

###### number input and number check #######

def num_input():
    num, M, N = map(lambda x: int(x), input('Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma:').split(','))
    a = num, M, N
    num_check(*a)
    return a

def num_check(num, M, N):
    try:
        if M == 2:
            for i in str(num):
                if int(i) >= 2:
                    raise ValueError
                else:
                    pass
        elif M == 8:
            for i in str(num):
                if int(i) >= 8:
                    raise ValueError
                else:
                    pass
        else:
            pass
                
    except ValueError:
        print('The number is not in right format')
        num_input()
        
##############################################

a = num_input()
result = X_to_Y(*a)
print('The final number is:' + result)


*代码说明:
1.程序可以实现数字在2,8,10,16进制之间的任意转换。
2.原理说明:所有初始进制都转换成10进制,最后转换到目标进制。
3.内容说明:
        a. 函数num_input为输入函数,
        b. 函数num_check为检查输入的number的格式是否正确,比如二进制里输入2001或者8进制里输入9001就会提示错误,并要求重新输入。
        c. 先利用X_to_Dec函数,将任意进制的数字转换为十进制。
        d.然后利用Dec_to_Y函数,将任意进制的数字转换成目标进制。
4.X_to_Y将X_to_Dec和Dec_to_Y打包在一起。

Beer!Cheers!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-2 23:44:22 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-3 00:05 编辑

      楼主的代码无法输入10以上进制数
      任意进制(2 ~ 16)数互相转换
def foo():
    d , f = [chr(0x30 + i) for i in range(10)] + [chr(0x61 + i) for i in range(6)] , True
    while f:
        num , M , N = input('Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : ') . split(',')
        M , N = int(M) , int(N)
        if M > 1 and M < 17 and N > 1 and N < 17:
            x = 0
            for c in num:
                if c . lower() in d[: M]:
                    x = x * M + d[: M] . index(c . lower())
                else:
                    print('*** error : The number is not in right format\n')
                    break
            else:
                f = False
        else:
            print('*** error : initial number type or final number type wrong !\n')
    s = ''
    while x:
        s = d[x % N] + s
        x //= N
    return s

print(foo())
        运行实况:
D:\[00.Exerciese.2022]\Python>python x.py
Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : 100,16,10
256

D:\[00.Exerciese.2022]\Python>python x.py
Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : 7ffFFFffFFff,16,10
140737488355327

D:\[00.Exerciese.2022]\Python>python x.py
Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : 999,7,10
*** error : The number is not in right format

Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : 777,7,10
*** error : The number is not in right format

Please input *ur number*, *initial number type* and *final number type*, and the data should be sperated by comma : 666,7,10
342

D:\[00.Exerciese.2022]\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-3 00:41:45 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-9-2 23:44
楼主的代码无法输入10以上进制数
      任意进制(2 ~ 16)数互相转换


非常感谢!!我才发现这个问题!
我来学习一下你的代码!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-9 21:28:22 | 显示全部楼层
jackz007 发表于 2022-9-2 23:44
楼主的代码无法输入10以上进制数
      任意进制(2 ~ 16)数互相转换

又学习了一遍你的代码,优雅,太优雅!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表