2016-04-18 4 views
1

これは自然数からマッピングは、ベース3の文字列です:自然数をトライビット文字列に変換する簡単なアルゴリズムは何ですか?

0 => 0 
1 => 1 
2 => 2 
3 => 00 
4 => 01 
5 => 02 
6 => 10 
7 => 11 
8 => 12 
9 => 20 
10 => 21 
11 => 22 
12 => 000 
13 => 001 
14 => 002 
15 => 010 
16 => 011 
17 => 012 
18 => 020 
19 => 021 
20 => 022 
21 => 100 
22 => 101 
23 => 102 
24 => 110 
25 => 111 
26 => 112 
27 => 120 
28 => 121 
29 => 122 
30 => 200 
31 => 201 
32 => 202 
33 => 210 
34 => 211 
35 => 212 
36 => 220 
37 => 221 
38 => 222 
39 => 0000 
40 => 0001 
... 

前後にこのマッピングを、実行するための最も簡単かつ効率的な機能は何ですか?

+0

万一、空にない0対応文字列? – Bergi

+0

@Bergi nah、空文字列はNaNか未定義です。私はそれを使用することを考えましたが、テーブルは整列しません。アイデアがあれば教えてください。 – MaiaVictor

+0

String.toString(n、3)は、基数3の文字列を生成します。 –

答えて

0

気にしないが、それは非常に明白である判明:

function to(base, nat){ 
    var digits = []; 
    while (nat >= 0){ 
     digits.push(nat % base); 
     nat = Math.floor(nat/base)-1; 
    }; 
    return digits; 
}; 
function from(base, digits){ 
    var nat = digits[digits.length-1]; 
    for (var i=digits.length-2; i>0; --i) 
     nat = (nat + 1) * base + digits[i]; 
    return nat; 
}; 

トライビットはいえ、逆になっています。 reverseを使わずに(配列の最後まで押して)正しい順序を得る方法があるのだろうかと思います。

1

は、これは、いくつかの策略が必要ですが、Number.prototype.toStringparseIntを使用して行うことができます(空の文字列に0をマッピングするためにpow = 1i = 0で始まる)

function numToBase3(n) { 
    var pref = "", 
     offset = 0, 
     pow = 3; 
    while (n >= offset+pow) { 
     offset += pow; 
     pow *= 3; 
     pref += "0"; 
    } 
    return (pref + (n-offset).toString(3)).slice(-1-pref.length); 
} 
function base3ToNum(s) { 
    var offset = 0, 
     pow = 3; 
    for (var i=1; i<s.length; i++) { 
     offset += pow; 
     pow *= 3; 
    } 
    return parseInt(s, 3)+offset; 
} 

+0

'parseInt'が好きですね。 :)あなたは私のupvote、ありがとう。 – MaiaVictor

関連する問題