lua之m進位制轉換為n進位制-任意進位制轉換演算法

冷侃發表於2016-01-25

夠無聊的寫這個,為防止需要的人也無聊一遍,寫個吧

演算法有n種,但是,我們們一種就夠用了

 1 --陣列倒序排列
 2 local function orderByDesc( input )
 3     local output = {}
 4     local count = #input
 5     while count > 0 do
 6         table.insert(output, input[count] )
 7         count = count -1 
 8     end
 9     return output
10 end
11 
12 --進位制轉換,英文不行只好用拼音
13 --@dec 10進位制資料,好吧,只要是數字就呆以了
14 --@x 進位制,最常見的當然是二、八、十六、進位制
15 local function _Dec2X( dec, x )
16     --計算結果儲存在這裡
17     local new_number = {}
18 
19     --演算法如下:
20         --9527 = 9*(10^3)+5*(10^2)+2*(10^1)+7*(10^0)
21         --7 = 9527%10, 2 = (9527-7)%100/100
22         --f(n) = (dec % (x^i) - f(n-1))/x
23         --f(0) = 0
24     --a引數代表第幾位,返回是否繼續
25     local function f( a )
26         assert(a >= 1)
27         local mod = dec % math.pow(x, a)
28         local last_mod = (a == 1) and 0 or assert(new_number[a-1])
29         new_number[a] = (mod - last_mod)/math.pow(x, a - 1)
30         --取整數部分
31         new_number[a] = math.modf(new_number[a])
32         return mod ~= dec
33     end
34     --該函式取得某位值
35     local i = 1
36     while f(i) do
37         i = i + 1
38     end
39     
40     return new_number
41 end
42 
43 --將某個資料轉成X進位制
44 --以 9527,10進製為例,{7, 2, 5, 9}
45 local function _numberTable2X(  number_tbl,x )
46     local result = 0
47     for i,v in ipairs(number_tbl) do
48         print(result,x, i, v)
49         result = result + v*math.pow(x, i - 1)
50     end
51     return result
52 end
53 
54 local function test_Dec2X ()
55     local kTestNumber = 9527
56     local n1 = _Dec2X(kTestNumber, 10)
57     -- table.foreach(n1, function ( _,v )
58     --     print(v)
59     -- end)
60     assert(kTestNumber == _numberTable2X(n1, 10))
61 end
62 test_Dec2X()

 

相關文章