2、Py进制转换:荣耀机试题,任意2-64进制转10进制(自定义函数转换)

本文不直接解题,只解决其中核心部分:任意2-64进制数转10进制数

一、题目

原题:
小明最近在学bash语言,发现Bash算术运算相比于C/pvthon等其他语言有一个特性,是其中常量表示规则:
1、一般形式是[base#]n。base表示数字的基数,是一个2到64的十进制数值,n是在这个基数中数字的值。
2、如果没有base#部分,则跟C语言表示法一样:如果以0x或0X开头的常量,则是
十六进制。如果以0为开头的常量则是八进制数。否则为10进制
3、基数大于10的数字依次以小写字母a-z,大写字母A-Z@和_ (英文下划线)54个字符表示。
4、如果数字超出了基数的范围,则为非法输入。

请写代码,将bash常量输出十进制数值(数值小于10的18次方),如果为非法输入,请输出 ERROR

输入描述:
仅一行,表示bash算术常量

输出描述:
输出一行表示对应bash算术常量的10进制表示。如果输入非法,请输出Error。

例如:
输入:32
输出:32

输入:032
输出:26 (前缀0代表是8进制数)

输入:0x32
输出:50 (前缀0x代表16进制)

输入:2#1101
输出:13 (前缀2代表2进制数)

输入:32#77
输出:231

输入:64#@_
输出:4031

输入:32#@_
输出: ERROR (数字超出基数范围)

二、题目的核心问题

这里面核心是写出一个程序,能将N进制转为十进制数

先看一下N进制转10进制计算逻辑:

八进制数 032 转十进制数:
3*(8**1) + 2*(8**0) = 26

十六进制数 0x32 转十进制数:
3*(16**1)+ 2*(16**0)= 50

二进制数 1101 转十进制数:
1*(2**3) + 1*(2**2) + 0*(2**1) + 1*(2**0) = 13

三十二进制数 77 转十进制数:
7*(32**1) + 7*(32**0) = 231

六十四进制数 @_ 转十进制数:
62*(64**1) + 63*(64**0) = 4031

由此推导公式:

假设该64进制数为abc,则公式为: 
a * (64**2) + b * (64**1) + c *(64**0)

注意:32#@_ 是错误的,进制为32时,每个位置上的数都不应该大于31

在六十四进制中,十进制的0-9即用0-9表示,10-35这26个数依次用小写字母a-z表示,36-61这26个数依次用大写字母A~Z表示,最后剩余的62和63分别用@和_表示。

三、进制转换代码
'''
输入:32  输出:32
输入:032 输出:26 (前缀0代表是8进制数)
输入:0x32 输出:50 (前缀0x代表16进制)
输入:2#1101 输出:13  (前缀2代表2进制数)
输入:32#77  输出:231
输入:64#@_  输出:4031
输入:64#2   输出: ERROR (数字超出基数范围)
'''
import string

def other2decimal(n, x):
    '''任意2-64进制转10进制, 输入n代表要转的数,x代表进制'''
    # 在六十四进制中,十进制的0~9即用0~9表示,10~35这26个数依次用小写字母a~z表示,36~61这26个数依次用大写字母A~Z表示,最后剩余的62和63分别用@和_表示。
    # 1、强制转换成字符
    n = str(n)

    # 2、判断进制是否符合范围
    if x < 2 or x > 64:
        return 'ERROR'

    # 3、构建64进制数的数值表示列表
    li1 = [str(i) for i in range(10)]
    li2 = list(string.ascii_letters)
    li3 = ['@', '_']
    li = li1 + li2 + li3

    # 4、判断每个位置是否超出基数范围(数值如果大于或等于进制,返回ERROR)
    for i in n:
        if li.index(i) >= x:
            return 'ERROR'

    # 5、转换成10进制数
    number = 0
    idx = len(n) - 1
    for i in n:
        number += li.index(i) * (x**idx)   # a * (64**2) + b * (64**1) + c *(64**0)
        idx -= 1

    return number

print(other2decimal('32', 8))
print(other2decimal('32', 16))
print(other2decimal('@_', 32))
print(other2decimal('32', 1))
# print((64*63) **1 + 64)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值