파이썬은 주어진 기본 문자열에서 정수를 쉽게 만들 수 있습니다.
int(str, base).
나는 inverse : integer에서 문자열 생성 을 수행하고 싶습니다. 즉 int2base(num, base)
, 다음과 같은 함수를 원합니다 .
int(int2base(x, b), b) == x
함수 이름 / 인수 순서는 중요하지 않습니다.
어떤 번호 x
와 기본 b
이int()
받아 들일 것입니다.
이것은 작성하기 쉬운 함수입니다. 실제로이 질문에서 설명하는 것보다 쉽습니다. 그러나 뭔가 빠진 것 같아요.
나는 기능에 대해 알고 bin
, oct
, hex
,하지만 몇 가지 이유를 사용할 수 없습니다 :
-
이 함수는 이전 버전의 Python에서는 사용할 수 없으며 (2.2)와 호환되어야합니다.
-
다른 기지에 대해 같은 방식으로 호출 할 수있는 일반적인 솔루션을 원합니다.
-
2, 8, 16 이외의 기지를 허용하고 싶습니다
관련
답변
고대 버전의 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
매우 큰 정수의 경우.
답변
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
답변
좋은 답변입니다! 내 질문에 대한 대답이 “아니오”라고 생각합니다. 확실한 해결책이 없었습니다. 다음은 답변에 표현 된 좋은 아이디어를 요약하는 데 사용할 기능입니다.
- 발신자 제공 문자 매핑 허용 (base64 인코딩 허용)
- 음수 및 0 확인
- 복소수를 튜플의 문자열로 매핑
def int2base(x,b,alphabet='0123456789abcdefghijklmnopqrstuvwxyz'): 'convert an integer to its string representation in a given base' if b<2 or b>len(alphabet): if b==64: # assume base64 rather than raise error alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" else: raise AssertionError("int2base base out of range") if isinstance(x,complex): # return a tuple return ( int2base(x.real,b,alphabet) , int2base(x.imag,b,alphabet) ) if x<=0: if x==0: return alphabet[0] else: return '-' + int2base(-x,b,alphabet) # else x is non-negative real rets='' while x>0: x,idx = divmod(x,b) rets = alphabet[idx] + rets return rets
답변
재귀
나는 것이다 단순화 대부분의 투표 대답 에를 :
BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b):
return "0" if not n else to_base(n//b, b).lstrip("0") + BS[n%b]
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"
답변
파이썬에는 임의의 기준으로 정수를 인쇄하는 내장 함수가 없습니다. 원한다면 직접 작성해야합니다.