luaのm進法からn進法-任意進法への変換アルゴリズム

4507 ワード

退屈にこれを書いて、必要な人も退屈にならないように、書いてください.
アルゴリズムはn種類ありますが、私たちは1種類で十分です.
 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()