一尘不染

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

python

Python允许通过给定基数的字符串通过以下方式轻松创建整数

int(str, base). 

我想执行相反的操作:从integer创建一个字符串,即我想要一些函数int2base(num, base),例如:

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

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

对于任何数量x和底座b是int()会接受的。

这是一个易于编写的函数:实际上,比在此问题中对其进行描述更容易。但是,我觉得我必须丢失一些东西。

我知道的功能binocthex,但我不能使用他们的几个原因:

这些功能在旧版本的Python上不可用,我需要与这些版本兼容(2.2)

我想要一个通用的解决方案,可以针对不同的基础使用相同的方法

我想允许除2、8、16以外的其他基数


阅读 640

收藏
2020-02-13

共2个答案

一尘不染

如果您需要与Python的旧版本兼容,则可以使用gmpy(它确实包含快速,完全通用的从int到字符串的转换功能,并且可以针对此类旧版本进行构建-您可能需要尝试使用较旧的版本,因为最近的版本尚未针对过时的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)
2020-02-13
一尘不染

出乎意料的是,人们只给出了转换为较小基数(小于英文字母的长度)的解决方案。没有尝试给出一种可以将任何从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],

2020-02-13