生活,应用中,会遇到一类极有规律的字符序列,像这样:
一琢磨,跟数制很像,但又不全是,那么列出一部分对比看看
于是,不妨使 A-Z 分别对应 0-25
通过统计,可以先算出几个特殊的值,比如AA对应26, AZ对应51,列个表吧
AA | 26 |
---|
AZ | 26+25=51 |
AAA | 1X26X26+1X26+0=702 |
AAZ | 1X26X26+1X26+25=727 |
分析以后,可以发现,当字母位于“个位”时,所代表的就是它对应的数即 A-Z~0-25,“十位”上的A-Z,按数制的话应该是代表(0~25)x26,但事实上是(1~26)x26,所以按照数字数制来算的话,比如 26(AA) 上短除法
这样的话,算出来是 10, 对应到字母,就是 BA。
本来应该是AA,但是十位却变成了B,成了BA,一对比,跟刚刚的统计规律不谋而合,除了“个位”,其它高位上,A-Z 对应的是 1-26 而不是 0-26
- 那么,就可以根据一个字符26进制数,计算出对应的10进制,比如 ABZ = 1x26^2+2x26+25
编程这样实现
chr26 = 'AAZ'
num10 = 0
for i in range(ln:=len(chr26)):
if i-ln+1:
num10 += (ord(chr26[i])-65+1)*26**i
else:
num10 += ord(chr26[i])-65
print(num10)
- 那么问题又来了,怎么把10进制转换为 字符26进制 呢??!!!【直接按数制来已经证明不行了,头大】
冷静分析,按前面的分析,短除法也能用,只是除了个位上,其它位数都比实际多了一个单位,那么就好办了,照样用短除法,只不过算出来的数,除了个位上的,其余都要减去 1,要是算出来0,再减1那不是-1?!!,不,在这里0-1=25,那么如何实现,如下
chr26 = [chr(65 + i) for i in range(26)]
zh = ''
while x!=-1:
zh = chr26[x % 26] + zh
x = x // 26 - 1
print(zh)
到这里,说好的算出来再 -1呢,怎么变成 x = x // 26 - 1 了,不急,x 经过 x//26 运算后,得到的数用于下一次短除法,但是这样算下去,会有几个问题,比如 26*26(ZA),要是算完再 减1, 那么就是 0 25 0 (AZA)那就坏了,
-
【算完还要减1的问题】 所以就先把 x//26 后再减去 1,这样就会使得下一次计算所得的余数比正规短除法少着1【很容易理解,5//3=2, (5-1)/3=5//3-1//3=2-1】
-
【算完减1出现 “-1”的问题】把 x//26 后再减去 1,就避免了出现-1的问题,出现-1是因为计算某高位是出现 n26//26 = 0, 如果上一步就 x//26 后再减去 1,那么会得到【(n26-1)//26 = (n-1)*26//26 + (26-25)//26 = 25】,同时,这样也避免了26*26 计算出来得到AZA(多出一高位A)因为先减去1,自然就到不了高位【类似于先减1 ,不够除的话已经向高位借位】
是有点绕,不过我这种思路的根本还是那张表,细细品一下,发现也不那么绕