如何从任意大的任意基地转换为另一个

Eri*_* R. 6 algorithm math base

我想要做的是将一个字符串从一个"字母"转换为另一个,就像在基数之间转换数字,但更抽象和任意数字.

例如,将"255"从字母"0123456789"转换为字母"0123456789ABCDEF"将导致"FF".一种方法是将输入字符串转换为整数,然后再将其转换回来.像这样:(伪代码)

int decode(string input, string alphabet) {
  int value = 0;
  for(i = 0; i < input.length; i++) {
    int index = alphabet.indexOf(input[i]);
    value += index * pow(alphabet.length, input.length - i - 1);
  }
  return value;
}

string encode(int value, string alphabet) {
  string encoded = "";
  while(value > 0) {
    int index = value % alphabet.length;
    encoded = alphabet[index] + encoded;
    value = floor(value / alphabet.length);
  }
  return encoded;
}
Run Code Online (Sandbox Code Playgroud)

这样decode("255", "0123456789")返回整数255,并encode(255, "0123456789ABCDEF")返回"FF".

这适用于小字母,但我希望能够使用base 26(所有大写字母)或base 52(大写和小写)或base 62(大写,小写和数字),以及可能超过a的值百位数.从理论上讲,上面的算法可以用于这样的字母表,但是,在实践中,我遇到了整数溢出,因为当你开始做62 ^ 100时数字变得如此之快.

我想知道的是,如果有一个算法来做这样的转换而不必跟上这样巨大的整数?也许是在处理整个输入字符串之前开始输出结果的方法?

我的直觉告诉我,这可能是可能的,但我的数学技能缺乏.任何帮助,将不胜感激.

StackOverflow上有一些类似的问题,但似乎没有一个正是我正在寻找的.

ElK*_*ina 2

以任意基数存储数字的通用方法是将其存储为整数数组。至少,一个数字将由一个基数和代表该基数中不同数字的 int 数组(或短或长,取决于您想要的基数范围)来表示。

接下来,您需要在该任意基数上实现乘法。

之后就可以实现转换了(提示:如果x是旧基数,则在新基数中计算x,x^2,x^3,...,然后将旧基数中的数字相应地乘以这些数字,然后将它们加起来)。