簡體   English   中英

將 integer 轉換為字符數盡可能少的字母數字字符串

[英]Convert an integer to an alphanumeric string with as few characters as possible

我正在尋找一種方法將十進制 integer 表示形式減少為盡可能少的字符的字符串。

例如,十六進制在十進制數字之上使用字母 AF。

hex(123)

有沒有一種平滑的方法可以利用所有字母來進一步減少字符串長度?

這樣您就可以使用自己的字母表,甚至可以用 0-9、AZ、az 擴展它:

遞歸:

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b): 
  if not n: return "0"
  return to_base(n//b, b).lstrip("0") + BS[n%b]

迭代:

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b):
    res = ""
    while n:
        res+=BS[n%b]
        n//= b
    return res[::-1] or "0"

注意:對於非常大的整數和負數,遞歸版本可能引發RuntimeError: maximum recursion depth exceeded in cmp

編碼器用法:參數(n, b)的意思是(要轉換的數,要使用的基數),例如:

>>> to_base(123,2)
'1111011'
>>> to_base(123,16)
'7B'
>>> to_base(123,len(BS))
'3F'
>>> to_base(1234567890000,16)
'11F71FB0450'
>>> to_base(1234567890000,len(BS))
'FR5HUGK0'

使用 len(BS) 意味着您將使用 BS 變量中的所有字符作為轉換的基礎。

迭代解碼器:

def to_dec(n, b):
    res = 0
    power = 1
    for letter in enumerate(n[::-1]):
        i = BS.find(letter)
        res += i*power
        power *= b
    return res

解碼器用法:參數(n, b)的意思是(要轉換的數字,要使用的基數),例如:

>>> to_dec('1111011',2)
123
>>> to_dec('7B',16)
123
>>> to_dec('3F',len(BS))
123
>>> to_dec('11F71FB0450',16)
1234567890000
>>> to_dec('FR5HUGK0',len(BS))
1234567890000

希望這有用;)

編輯:添加編碼器用法
編輯:添加解碼器
編輯:添加解碼器用法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM