在python中添加字符串(作为基数12的表示)和整数/其他字符串

2024-04-29 08:46:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个计算器,可以添加数字的基数12和不同的限制在不同的数字。你知道吗

碱基12序列:[0,1,2,3,4,5,6,7,8,9,“A”,“B”]

限制必须是:

  • 第一位:限位“B”
  • 第二位:限制4

这意味着你会这样计算:[1,2,3,4,5,6,7,8,9,A,B,10,11,…48,49,4A,4B]

但我不知道怎样才能使我能算出两个数的和呢

我用python编写了以下代码:

list1=[0,1,2,3,4,5,6,7,8,9,"A","B"]
list2=[0,1,2,3,4]
list3=[0,1,2,3,4,5,6,7,8,9,"A","B"]
list4=[0,1,2,3,4]


def calculadora (entrada1, operacion, entrada2):
    #parte de valor 1:
    digito1_1=str(list2[int(entrada1//12)])
    digito1_2=str(list1[int(entrada1%12)])
    valor1=float(digito1_1+digito1_2)
    #parte de valor 2
    digito2_1=str(list2[int(entrada2//12)])
    digito2_2=str(list1[int(entrada2%12)])
    valor2=float(digito2_1+digito2_2)
    if operacion==str("suma") or "+":
        return float(valor1+valor2)
entrada1 = float(input("inserte primer valor"))
operacion=str(input("inserte operación"))
entrada2 = float(input("inserte segundo valor"))
print (calculadora(entrada1,operacion,entrada2))

它适用于数字,但我想对3B这样的数字求和,它给了我一个ValueError,因为它被编码为字符串。你知道吗

有人能帮我吗?或者说我怎样才能把这些数字加起来?你知道吗


Tags: input数字floatcalculadoravalorintstrlist2
3条回答

如果将A和B转换为11和12,则可以直接添加它们。然后,因为每个数字现在都是一个数字列表,所以可以像ALU那样添加它们。请参阅有关计算机算术的任何文本中的整数加法部分。你知道吗

def add(A, B):

    result = []
    carry = 0
    for a, b in reversed(zip(A,B)):
        carry, digit = divmod(a + b + carry, 12)
        result.append(digit)

    if carry:
        result.append(carry)

    result.reverse()
    return result


>>> add([4,3],[6,11])
[11, 2]
>>> add([5,3],[6,11])
[1, 0, 2]

名单是MSD优先。如果列表首先在LSD中,则不需要双重反转。你知道吗

将base-12编码字符串转换为int的最简单方法是通过int(string, 12)。反过来就不那么容易了,因为Python似乎没有一种内置的方法来实现这一点。可以对二进制、八进制和十六进制使用格式说明符,但不能使用任意基。你知道吗

您可以使用divmod()得到一个反转的数字列表,它用余数除法。你知道吗

def to_digits(x, base):
     while x > 0:
         x, rem = divmod(x, base)
         yield rem

但要往返,我们需要一根绳子。将int转换为一个字符(使用字符串作为查找表),并将它们连接成一个字符串,然后使用负阶跃切片将其反转。你知道吗

def to_base_12(num):
    return ''.join('0123456789AB'[d] for d in to_digits(num, 12))[::-1]

使用较长的查找表,可以将其概括为更高的基。你知道吗

字符串已经是序列了,但是如果你想把它转换回一个列表,你可以调用它的list()。相反的是你刚才看到的''.join()方法。你知道吗

现在您可以将base-12表示转换为Python int对象并返回,只需使用+添加它们即可。你知道吗

这里是对gilch中处理负数和零的优秀答案的细微变化。你知道吗

def convert_to_string(num, base):
    '''
    Convert integer (num) to base less than base 37.
    '''
    alpha = string.digits + string.ascii_lowercase

    assert isinstance(num, int)
    assert isinstance(base, int)
    assert 1 < base <= len(alpha)
    if num == 0:
        return '0'

    def to_digits(num, base, alpha):
        '''
        Generator to convert digits in reverse order.
        '''
        while num > 0:
            num, rem = divmod(num, base)
            yield alpha[rem]

    sign = ''
    if num < 0:
        num, sign = -num, '-'
    return sign + ''.join(d for d in reversed(tuple(to_digits(num, base, alpha))))


def convert_from_string(num, base):
    '''
    Convert string in base X to integer.
    '''
    return int(str(num), base)


def test():
    '''
    Test conversions.
    '''
    assert convert_to_string(0, 2) == '0'
    assert convert_to_string(4, 2) == '100'
    assert convert_to_string(23, 12) == '1b'
    assert convert_to_string(-6, 2) == '-110'
    assert convert_from_string('1b', 12) == 23
    assert convert_from_string('-110', 2) == -6

相关问题 更多 >