lua之m进制转换为n进制-任意进制转换算法

够无聊的写这个,为防止需要的人也无聊一遍,写个吧

算法有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()
时间: 2024-08-09 19:53:41

lua之m进制转换为n进制-任意进制转换算法的相关文章

C++实现将十进制数转换为小于等于九的任意进制

//十进制转换为小于等于九的任意进制数 #include<iostream> #include<string> #include<stack> using namespace std; stack<int> num; void change(int N,int M) { if(N<0||M<=1) { cout<<"error!"<<endl; return; } while(N>0) { num

【模板小程序】2~62位非负数任意进制转换,包含合法性检查

1 //进制转换模块 2 #include <iostream> 3 #include <string> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 //将任意字符转换为十进制 [0-9a-zA-Z],61个字符,最大表示62进制 10 int convertToDec(char c) 11 { 12 int decNum; 13 if(c>='0' &a

从M进制转换为N进制

/// <summary> /// 从M进制转换为N进制 /// </summary> internal class MBase2NBase { /// <summary> /// M进制值字符串 /// </summary> private string MValue = "123"; /// <summary> /// 除法商 /// </summary> private string Quotient = n

C语言:其他进制转换为十进制(方法二)

#include<stdio.h> #include<math.h> #include<string.h> #include<ctype.h> //其他任意进制转换为十进制 int main() { int trans(char a[],int ); char arr[100]; int t; printf("请输入进制的类型:"); scanf("%d",&t); printf("请输入该进制的数:

C语言:十进制进制转换为其他进制(思想:查表法)

// //  main.c //  Hex conversion // //  Created by ma c on 15/7/22. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:十进制向任意进制之间的转换(查表法). #include <stdio.h> //十六进制的转换 void ToHex(int num) { int temp; char chs[8];//定义一个临时容器,长度为8,8X4=32位比特 int

2~62位任意进制转换(c++)

进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的. 正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

C#实现整型数据字任意编码任意进制的转换和逆转换

实现如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace ConsoleApplication1 {      public class Number     {         public string Characters         {             get;             set;         }        

2-36进制,可以任意进制互转的类

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AnyConvertx2x { /// <summary> /// 数字进制转换类 /// </summary> public class AnyConvert { private static char[] rDigits = { '0', '1', '2', '3', '4', '5',