【问题标题】:What is a simple algorithm to convert natural numbers to tribit strings?将自然数转换为三位字符串的简单算法是什么?
【发布时间】:2016-04-18 15:26:14
【问题描述】:

这是从自然数到 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
...

来回执行这种映射的最简单和最有效的函数是什么?

【问题讨论】:

  • 不应该0对应空字符串吗?
  • @Bergi 不,空字符串将是 NaN,或未定义。我考虑过使用它,但是表格没有对齐。如果您有任何想法,请告诉我。
  • String.toString(n, 3) 在基数 3 中生成一个字符串

标签: javascript algorithm data-structures numbers


【解决方案1】:

这需要一些技巧,但可以使用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 映射到空字符串)

【讨论】:

  • 你喜欢parseInt,不是吗? :) 你有我的支持,谢谢。
【解决方案2】:

没关系,事实证明这很明显:

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 的情况下获得正确的顺序(同时推到数组的末尾)。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2010-09-18
    • 1970-01-01
    • 2017-02-14
    • 2021-07-21
    • 2012-08-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多