2016-04-18 37 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,或者是undefined。我想過使用它,但是桌子不對齊。讓我知道你是否有想法。 – 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來完成:

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爲空字符串)

+0

你喜歡'parseInt',不是嗎? :)你有我的讚賞,謝謝。 – MaiaVictor

相關問題