簡體   English   中英

將自然數轉換為三比特字符串的簡單算法是什么?

[英]What is a simple algorithm to convert natural numbers to tribit strings?

這是從自然數到 base-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
...

來回執行此映射的最簡單和最有效的函數是什么?

它需要一些Number.prototype.toString ,但可以使用Number.prototype.toStringparseInt來完成:

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;
}

(從pow = 1i = 0開始將 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 (同時推到數組的末尾)的情況下獲得正確的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM