如何将整数转换为任意进制的字符串?
Python可以很简单地通过给定的进制把字符串转换成整数,方法是使用
int(str, base).
我想做的是反向操作:从一个整数创建字符串,也就是说,我想要一个函数 int2base(num, base)
,它能做到:
int(int2base(x, b), b) == x
函数的名字和参数顺序并不重要。
对于任何一个数字 x
和 b
(也就是 int()
可以接受的进制)。
这个函数其实很简单,写起来比我在这里描述它要容易多了。不过,我觉得我可能漏掉了什么。
我知道有 bin
、oct
和 hex
这些函数,但我不能用它们,原因有几个:
这些函数在旧版本的Python中不可用,而我需要兼容(2.2)
我想要一个通用的解决方案,可以对不同的进制使用相同的调用方式
我想支持除了2、8、16以外的其他进制
相关链接
36 个回答
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能会在代码中遇到错误,或者想知道如何更好地实现某个功能。这时候,StackOverflow这个网站就很有用。它是一个程序员交流的平台,大家可以在这里提问、回答问题,分享经验。
在这个网站上,你可以看到很多人提出的问题和他们的解决方案。每个问题下面通常会有很多人给出的不同答案,有的可能很简单,有的则比较复杂。通过这些讨论,初学者可以学到很多实用的知识和技巧。
总之,StackOverflow是一个很好的资源,特别是对于刚开始学习编程的人来说,可以帮助你更快地解决问题,提升自己的技能。
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
让人惊讶的是,大家给出的解决方案都是把数字转换成小的进制(比英语字母表的长度还小)。没有人尝试提供一个可以把数字转换成任意进制的方法,从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]
,
你可以把这个结果再转换成你想要的任何进制。
- 有时候你会发现,内置的库函数并不能满足你的需求,所以你需要自己写一个。如果你不同意,请分享你自己的解决方案,展示一个可以把十进制数字转换成577进制的内置函数。
- 这主要是因为对某个进制下的数字含义缺乏理解。
- 我鼓励你思考一下,为什么你用的方法只适用于 n <= 36。一旦你想明白了,就会明白我这个函数为什么返回一个列表,以及它的函数签名是这样的原因。
如果你需要让你的代码能在很老的Python版本上运行,你可以选择使用gmpy这个库。这个库里有一个快速的、通用的整数转字符串的功能,而且可以在那些老版本上使用。不过,你可能需要尝试一些旧版本的gmpy,因为最近的版本没有在那些古老的Python和GMP版本上测试过,只是在比较新的版本上测试过。
另外,如果你不太在乎速度,而更看重方便的话,可以直接用Python代码来实现。例如,在Python 2中,最简单的写法是:
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)
而在Python 3中,使用int(x / base)
会得到错误的结果,所以需要改成x // base
:
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[x % base])
x = x // base
if sign < 0:
digits.append('-')
digits.reverse()
return ''.join(digits)