luaのm進法からn進法-任意進法への変換アルゴリズム
4507 ワード
退屈にこれを書いて、必要な人も退屈にならないように、書いてください.
アルゴリズムはn種類ありますが、私たちは1種類で十分です.
アルゴリズムは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()