Mar*_*ing 186 python base radix
Python允许从给定base的字符串中轻松创建整数
int(str, base).
Run Code Online (Sandbox Code Playgroud)
我想执行逆向:从整数创建一个字符串,即我想要一些函数int2base(num, base),这样:
int(int2base(x, b), b) == x
Run Code Online (Sandbox Code Playgroud)
函数名称/参数顺序并不重要.
对于任何数量x和底座b是int()会接受的.
这是一个很容易编写的函数:实际上它比在这个问题中描述它更容易.但是,我觉得我必须遗漏一些东西.
我知道的功能bin,oct,hex,但我不能使用他们的几个原因:
这些函数在旧版本的Python上不可用,我需要与它兼容(2.2)
我想要一个通用的解决方案,可以用不同的基础调用相同的方法
我想允许2,8,16以外的碱基
Sal*_*ali 93
令人惊讶的是,人们只提供转换为小基数的解决方案(小于英文字母的长度).没有尝试提供从2到无穷大转换为任意碱基的解决方案.
所以这是一个超级简单的解决方案:
def numberToBase(n, b):
if n == 0:
return [0]
digits = []
while n:
digits.append(int(n % b))
n //= b
return digits[::-1]
Run Code Online (Sandbox Code Playgroud)
所以,如果你需要将一些超大数字转换为基数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],
您可以稍后将其转换为您想要的任何基础
Ale*_*lli 91
如果你需要兼容古老版本的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)
Run Code Online (Sandbox Code Playgroud)
jel*_*ree 88
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])
Run Code Online (Sandbox Code Playgroud)
参考:http: //code.activestate.com/recipes/65212/
请注意,这可能会导致
RuntimeError: maximum recursion depth exceeded in cmp
Run Code Online (Sandbox Code Playgroud)
对于非常大的整数.
Ros*_*ost 73
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
Run Code Online (Sandbox Code Playgroud)
Mar*_*ing 21
很棒的答案!我想我的问题的答案是"不"我没有错过一些明显的解决方案.这是我将使用的功能,它浓缩了答案中表达的好主意.
__PRE__
sem*_*nte 14
您可以baseconv.py在我的项目中使用:https://github.com/semente/python-baseconv
样品用法:
>>> from baseconv import BaseConverter
>>> base20 = BaseConverter('0123456789abcdefghij')
>>> base20.encode(1234)
'31e'
>>> base20.decode('31e')
'1234'
>>> base20.encode(-1234)
'-31e'
>>> base20.decode('-31e')
'-1234'
>>> base11 = BaseConverter('0123456789-', sign='$')
>>> base11.encode('$1234')
'$-22'
>>> base11.decode('$-22')
'$1234'
Run Code Online (Sandbox Code Playgroud)
有一些bultin转换器,例如baseconv.base2,baseconv.base16和baseconv.base64.
我想简化了最投票回答到:
BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b):
return "0" if not n else to_base(n//b, b).lstrip("0") + BS[n%b]
Run Code Online (Sandbox Code Playgroud)
对于RuntimeError: maximum recursion depth exceeded in cmp非常大的整数和负数也有相同的建议。(您可以使用sys.setrecursionlimit(new_limit))
为了避免递归问题:
BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(s, b):
res = ""
while s:
res+=BS[s%b]
s//= b
return res[::-1] or "0"
Run Code Online (Sandbox Code Playgroud)
小智 5
def base(decimal ,base) :
list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
other_base = ""
while decimal != 0 :
other_base = list[decimal % base] + other_base
decimal = decimal / base
if other_base == "":
other_base = "0"
return other_base
print base(31 ,16)
Run Code Online (Sandbox Code Playgroud)
输出:
「1F」
小智 5
def base_conversion(num, base):
digits = []
while num > 0:
num, remainder = divmod(num, base)
digits.append(remainder)
return digits[::-1]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
201189 次 |
| 最近记录: |