Xnary(像二进制但不同)计数

Rud*_*die 6 algorithm math binary logging

我正在创建一个将数字转换为具有预定义字符的字符串的函数.原来,我知道.我开始了,因为当时看起来很有趣.我自己做.嗯,这令人沮丧,而且不好玩.

我希望它像二进制一样,因为任何左边的角色都比它的右边界更有价值.二进制是低效的,因为每个位只有1个正值.Xnary是有效的,因为'bit'永远不会为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??
Run Code Online (Sandbox Code Playgroud)

我发现这个 在这里,但有AA相同AAAA.函数的结果永远不会AAAAA.

该字符串A是由不同的AAAAA然而,这样的数字太.(不同于二进制1,01,001等),因为更长的字符串总是比一个更短更有价值...... A < AA < AAA.

这有意义吗?我之前试图解释它并且失败了.我之前也尝试过.=)

最重要的是:因为A < AA < AAA,'my' ABC的值高于其他脚本的值.另一个区别:我的脚本不存在,因为我一直都在失败.

我试过这个算法:

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
Run Code Online (Sandbox Code Playgroud)

听起来很公平?显然这是废话.因为:

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
Run Code Online (Sandbox Code Playgroud)

如果1A(xnary的第一个),那是0什么?不可能是它的本质.

所以这个是一个半身像.另一个(在jsFiddle上)也是一个半身像,因为A != AA != AAA这是一个事实.

那几个漫长的夜晚我失踪了什么?

哦顺便说一句:如果你不喜欢数字,请不要读这个.

PS.我试过寻找类似的问题,但没有一个相似.一个参考文献最相似,但"有缺陷"的IMO.

Dan*_*her 4

也称为 Excel 列编号。如果我们平移一位,A = 0, ..., Z = 25, AA = 26, ...至少对于计算来说会更容易。对于您的方案,只需在转换为 Xnary 之前减去 1 即可。转换后添加。

因此,通过修改,让我们开始寻找转换。首先,我们需要编码多少个符号n?嗯,有 26 个一位数,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'
Run Code Online (Sandbox Code Playgroud)

或者

26^(d-1) <= (25*n)/26 + 1 < 26^d
Run Code Online (Sandbox Code Playgroud)

也就是说,我们需要d(n) = floor(log_26(25*n/26+1)) + 1数字来编码n >= 0。现在我们必须减去最多需要位数的数字总数来找到 - 位数字中d(n) - 1的位置,我们称之为。然后的编码只是 的-digit base-26 编码。nd(n)p(n) = n - 26*(26^(d(n)-1)-1)/25nd(n)p(n)

另一个方向的转换是基数 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
Run Code Online (Sandbox Code Playgroud)

对于N = 158760n = 158759log_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
Run Code Online (Sandbox Code Playgroud)