我正在做一个将数字转换为带有预定义字符的字符串的函数。原来,我知道。我开始了,因为当时看起来很有趣。靠我自己做。好吧,这很令人沮丧而且不好玩。
我希望它像二进制一样,因为任何左字符都比其右近邻更有值(value)。二进制效率低下,因为每个位只有1个正值。 Xnary是有效的,因为“位”从不为0。
字符集(在这种情况下):A - Z
。
A = 1 ..
Z = 26
AA = 27 ..
AZ = 52
BA = 53 ..
BZ = 2 * 26 (B) + 26 * 1 (Z) = 78... Right?
ZZ = 26 * 26 (Z) + 26 * 1 (Z) = 702?? Right??
我找到了this here,但是
AA
与A
和AAA
相同。该函数的结果永远不会是AA
或AAA
。字符串
A
与AA
和AAA
不同,因此数字也应该相同。 (与二进制1
,01
,001
等不同。)由于长字符串总是比短字符串... A < AA < AAA
更有值(value)。这有意义吗?我曾经尝试解释过,但失败了。我也曾经尝试过。 =)
最重要的是:自
A < AA < AAA
以来,“my”的ABC
的值高于其他脚本的值。另一个区别:我的脚本不存在,因为我一直失败。我已经尝试过this algorithm:
N = 1000, Size = 3, (because 26 log(1000) = 2.x), so use 676, 26 and 1 for positions:
N = 1000
P0 = 1000 / 676 = 1.x = 1 = A
N = 1000 - 1 * 676 = 324
P1 = 324 / 26 = 12.x = 12 = L
N = 324 - 12 * 26 = 12
P1 = 12 / 1 = 12 = L
1000 => ALL
听起来很公平?显然是胡扯。因为:
N = 158760, Size = 4, so use 17576, 676, 26 and 1
P0 = 158760 / 17576 = 9.x = 9 = I
N = 158760 - 9 * 17576 = 576
P1 = 576 / 676 = 0.x = 0 <<< OOPS
如果
1
是A
(xnary的第一个),那么0
是什么?这是不可能的。所以这是半身像。另一个(on jsFiddle)也是半身像,因为
A != AA != AAA
就是事实。那么,我已经迷失了几个漫长的夜晚吗?
哦,顺便说一句:如果您不喜欢数字,请不要阅读。
PS。我曾尝试搜索相似的问题,但没有一个足够相似。一个引用文献最相似,但“有缺陷”的IMO。
最佳答案
也称为Excel列编号。至少对于计算而言,如果我们将其移动A = 0, ..., Z = 25, AA = 26, ...
会更容易。对于您的方案,在转换为Xnary表示形式之前,所需要做的就是减去1。转换后的加法。
因此,通过修改,让我们开始寻找转换。首先,我们需要多少个符号来编码n
?好吧,这里有26个1位数,26 ^ 2两位数,26 ^ 3三位数等。因此,最多使用d
个位数的总数为26^1 + 26^2 + ... + 26^d
。那是几何级数的开始,我们知道和的封闭形式26*(26^d - 1)/(26-1)
。所以要编码n
,如果需要,我们需要d
数字
26*(26^(d-1)-1)/25 <= n < 26*(26^d-1)/25 // remember, A = 0 takes one 'digit'
或者
26^(d-1) <= (25*n)/26 + 1 < 26^d
也就是说,我们需要
d(n) = floor(log_26(25*n/26+1)) + 1
数字来编码n >= 0
。现在,我们必须减去最多需要d(n) - 1
位的数字总数,才能找到n
在d(n)
位数字中的位置,我们将其称为p(n) = n - 26*(26^(d(n)-1)-1)/25
。然后n
的编码就是d(n)
的p(n)
-digit base-26编码。然后,在另一个方向上的转换是以26为基数的扩展,然后添加
26*(26^(d-1) - 1)/25
。因此,对于
N = 1000
,我们对n = 999
,log_26(25*999/26+1) = log_26(961.5769...) = 2.x
进行编码,我们需要3位数字。p(999) = 999 - 702 = 297
297 = 0*26^2 + 11*26 + 11
999 = ALL
对于
N = 158760
,n = 158759
和log_26(25*158759/26+1) = 3.66...
,我们需要四个数字p(158759) = 158759 - 18278 = 140481
140481 = 7*26^3 + 25*26^2 + 21*26 + 3
158759 = H Z V D
关于algorithm - Xnary(类似于二进制但不同)计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8797736/