1

考虑 Microsoft Excel 的列编号系统。列是“编号的” A, B, C, ... , Y, Z, AA, AB, AC, ... 其中A1.

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

(以 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

从 zeroless 系统转换到我们的 base 10 系统相当简单;这仍然是将该空间的功率乘以该空间中的值并将其添加到总数中的问题。所以在AAA使用字母表的情况下ABC,它等价于(1*3^2) + (1*3^1) + (1*3^0) = 9 + 3 + 1 = 13

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

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

编辑

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

4

1 回答 1

4

首先转换为 base-3-with-zeroes(数字 0AB),然后从那里转换为 base-3-without-zeroes (ABC),使用以下字符串替换:

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

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

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

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

可推广到任何基础。

于 2016-10-31T16:02:14.407 回答