algorithm - 与没有零数字的数字系统相互转换

标签 algorithm radix greedy base-conversion number-systems

考虑 Microsoft Excel 的列编号系统。列是“编号”ABC、...、YZ, AA, AB, AC, ... 其中 A1.

列系统类似于我们熟悉的以 10 为基数的编号系统,当任何数字具有最大值并递增时,其值设置为可能的最低数字值和其左侧的数字递增,或者在最小值处添加一个新数字。区别在于字母编号系统中没有代表零的数字。因此,如果“数字字母表”包含 ABC123,我们可以这样计算:

(以 3 为底,添加零以进行比较)

base 3 no 0    base 3 with 0    base 10 with 0
-----------    -------------    --------------
  -      -            0               0
  A      1            1               1
  B      2            2               2
  C      3           10               3
 AA     11           11               4
 AB     12           12               5
 AC     13           20               6
 BA     21           21               7
 BB     22           22               8
 BC     23          100               9
 CA     31          101              10
 CB     32          102              11
 CC     33          110              12
AAA    111          111              13

从无零系统转换为以 10 为基数的系统非常简单;仍然是将该空间的功率乘以该空间的值并将其添加到总数中的问题。所以对于 AAA 和字母表 ABC 来说,它等价于 (1*3^2) + (1*3^1) + (1* 3^0) = 9 + 3 + 1 = 13

不过,我在反向转换时遇到了问题。使用从零开始的系统,您可以使用贪婪算法从最大数字移动到最小数字并捕获任何适合的数字。但是,这不适用于无零系统。例如,将以 10 为底的数字 10 转换为以 3 为底的无零系统:虽然 9(第三个数字槽:3^2)适合 10,这将无法配置最后两位数字,因为它们的最小值为 1*3^1 = 31*3^0 = 1 分别。

实际上,我的数字字母表将包含 A-Z,因此我正在寻找一种快速、无需反复试验或从零开始计数即可完成此操作的通用转换方法。

编辑

n.m. 接受的答案主要是一个基于字符串操作的解决方案。 对于纯数学解决方案,请参阅 kennytm 的链接:

最佳答案

首先转换为带零的基数 3(数字 0AB),然后使用这些字符串替换从那里转换为不带零的基数 (ABC):

   A0  =>  0C
   B0  =>  AC
   C0  =>  BC

每次替换要么删除一个零,要么将一个推到左边。最后,丢弃前导零。

作为优化,也可以一次处理更长的零字符串:

A000...000 = 0BBB...BBC
B000...000 = ABBB...BBC
C000...000 = BBBB...BBC

可推广到任何基础。

关于algorithm - 与没有零数字的数字系统相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40345469/

相关文章:

c - 用 C 语言进行 Base64 到 Base10 解码

algorithm - 寻找图的最大独立集的这种贪心算法的复杂性

python - 动态规划 : Rod cutting and remembering where cuts are made

algorithm - Codeforces Round 671 Div 1 C(数组的终极怪异)

linux - 使用 bash 添加一个常数来移动文件名

C# 转换为基类并使用它的方法

algorithm - 模板与旋转匹配

python - python中的二进制搜索树不起作用

algorithm - 贪心算法和最优子结构

c++ - 具有多个约束条件(例如重量,体积等)的背包