考虑 Microsoft Excel 的列编号系统。列是“编号的” A
, B
, C
, ... , Y
, Z
, AA
, AB
, AC
, ... 其中A
是1
.
列系统类似于我们熟悉的以 10 为底的编号系统,因为当任何数字具有最大值并递增时,其值被设置为可能的最低数字值,并且其左侧的数字递增,或在最小值处添加一个新数字。不同之处在于字母编号系统中没有代表零的数字。因此,如果“数字字母表”包含ABC
or 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 = 3
和1*3^0 = 1
.
实际上,我的数字字母表将包含 AZ,因此我正在寻找一种快速、通用的转换方法,无需反复试验或从零开始计数。
编辑
nm 接受的答案主要是基于字符串操作的解决方案。对于纯数学解决方案,请参阅 kennytm 的链接: