【问题标题】:Implement numbering scheme like A,B,C… AA,AB,… AAA…, similar to converting a number to radix26 [duplicate]实现编号方案,如 A、B、C……AA、AB、……AAA……,类似于将数字转换为 radix26 [重复]
【发布时间】:2012-09-23 19:44:21
【问题描述】:

可能重复:
Xnary (like binary but different) counting

在 JavaScript 中,我想在 JavaScript 中实现一个编号方案,以便 1 是 A,2 是 B,...。26 是 Z,27 是 AA,28 是 AB .....

为此,代码如下:

function convertor(n){

     var x = n-1,
         baseCharCode = "A".charCodeAt(0);

     var arr = x.toString(26).split(''),
         len = arr.length;

     return arr.map(function(val,i){
         val = parseInt(val,26);

         if( (i === 0) && ( len > 1)){
              val = val-1;
         }

         return String.fromCharCode(baseCharCode + val);
     }).join('');
}

它似乎工作正常,但有什么优化它的想法或其他实现方式吗?

【问题讨论】:

标签: javascript algorithm character-encoding type-conversion


【解决方案1】:

此系统类似于Hexavigesimal(以 A = 0 开头),称为双射 base-26(它没有 0)。您可以像这样使用标准的基本转换算法对其进行转换:

function toDecimal(str) {
    var decimal = 0;
    var letters = str.split(new RegExp());

    for(var i = letters.length - 1; i >= 0; i--) {
        decimal += (letters[i].charCodeAt(0) - 64) * (Math.pow(26, letters.length - (i + 1)));
    }

    return decimal;
}

基本上,您从十六进制转换为以 10 为底,如下所示。假设您必须字符串“AB”。你所拥有的是:

1 0 (positions)
---
A B
+ +
| |
| +----> 2 * (26 ^ 0) +
+------> 1 * (26 ^ 1)
       = 28

这给你 28。

另一个例子:

2 1 0 (positions)
A B C
+ + +
| | |
| | +----> 3 * (26 ^ 0) +
| +------> 2 * (26 ^ 1) +
+--------> 1 * (26 ^ 2)
           = 731

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多