如何将任意基数的整数转换为字符串?

2024-04-26 18:57:06 发布

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

Python允许通过

int(str, base). 

我想执行逆操作:从整数创建字符串, i、 我想要一些函数int2base(num, base),这样:

int(int2base(x, b), b) == x

函数名/参数顺序不重要。

对于xb可以接受的任何数。

这是一个很容易编写的函数:事实上,它比在这个问题中描述它更容易。然而,我觉得我一定是错过了什么。

我知道函数binocthex,但是我不能使用它们有几个原因:

  • 这些函数在较旧版本的Python上不可用,我需要与(2.2)兼容

  • 我想要一个通用的解决方案,对于不同的基可以用相同的方法调用

  • 我要允许除2,8,16以外的基

相关


Tags: to函数字符串inbase参数stringbin
3条回答

如果您需要与早期版本的Python兼容,您可以使用gmpy(它确实包含一个快速、完全通用的int-to-string转换函数,并且可以为此类早期版本而构建——您可能需要尝试较旧的版本,因为最近的版本没有经过历史悠久的Python和GMP版本的测试,只使用最近的代码),或者,为了更快但更方便,使用Python代码——例如,最简单的是:

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[int(x % base)])
        x = int(x / base)

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)

令人惊讶的是,人们给出的解决方案只能转换成小基数(比英文字母表的长度小)。没有人试图给出一个从2到无穷的任意基的解。

所以这里有一个超级简单的解决方案:

def numberToBase(n, b):
    if n == 0:
        return [0]
    digits = []
    while n:
        digits.append(int(n % b))
        n //= b
    return digits[::-1]

所以如果你需要把一个超级大的数转换成基数577

numberToBase(67854 ** 15 - 102, 577),将为您提供正确的解决方案: [4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455]

你以后可以把它转换成任何你想要的基

def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

参考号: http://code.activestate.com/recipes/65212/

请注意,这可能会导致

RuntimeError: maximum recursion depth exceeded in cmp

对于非常大的整数。

相关问题 更多 >