3

重複の可能性:
Xnary (バイナリに似ているが異なる) カウント

JavaScript では、1 が A、2 が B、....26 が Z、27 が AA、28 が AB になるように、JavaScript で番号付けスキームを実装したいと考えています。

そのためのコードは次のとおりです。

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('');
}

それはうまくいくようですが、それを最適化するためのアイデアやそれを実装する別の方法はありますか?

4

1 に答える 1

4

このシステムは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;
}

基本的に、次のように 16 進数から 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
于 2012-10-02T22:18:49.250 に答える