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

【转自】——http://www.cnblogs.com/pkuoliver/archive/2010/10/27/Convert-m-number-to-n-number.html

 

这种题也是一道经典的面试题,主要考察进制转换细想,Coding质量等。

当我们把十进制转成二进制的时候,我们通过辗转相除,取余,逆置余数序列的过程得到新的进制的数。因此我们可以借助这种思想把M进制转成N进制的数。

如下是C的详细的实现方法

 

01void m2n(int m, char* mNum, int n, char* nNum)
02{
03    int i = 0;
04    char c, *p = nNum;
05 
06    //这是一个考察地方,是否能用最少乘法次数。
07    while (*mNum != '/0')
08        i = i*m + *mNum++ - '0';
09     
10    //辗转取余
11    while (i) {
12        *p++ = i % n + '0';
13        i /= n;
14    }
15    *p-- = '/0';
16 
17    //逆置余数序列
18    while (p > nNum) {
19        c = *p;
20        *p-- = *nNum;
21        *nNum++ = c;
22    }
23}

观察上面的代码,存在着众多的不足。例如,要对输入参数做检查,数值的大小收到int值最大值的限制等。不过好在一点,该算法的时间复杂度是O(n)的。

 

我们霹雳无敌的赵大叔又提供了一种用Java实现的通用的进制转换方法,即使Windows的计算器也转不了的大数,这个算法也可以转。算和上面的算法相比,他的基本思想不变,还是辗转除,但是用了字符串做大数相除,很不错的创新点,赞一个。代码如下:

 

01package test;
02 
03/**
04 * 功能:将一个数从M进制转换成N进制
05 * MValue:M进制数的字符串表示方法
06 * Shang:保存中间运算结果
07 * M:M进制
08 * N:N进制
09 */
10public class M2N {
11    // 在这里对输入赋值
12    public static String MValue = "1231412423534674574757";
13    public static String Shang = null;
14    public static int M = 10;
15    public static int N = 8;
16 
17    public static void main(String[] args) {
18        String nValue = "";
19        Shang = MValue;
20        while(Shang.length() > 0) {
21            nValue = qiuyu(Shang) + nValue;
22        }
23        System.out.println(nValue);
24    }
25 
26    /**
27     * 功能:对给定的M进制字符串对n求余。
28     *
29     * @param MTempValue
30     * @param m
31     * @param n
32     * @return
33     */
34    public static String qiuyu(String MTempValue) {
35        Shang = "";
36        int temp = 0;
37        while (MTempValue.length() > 0) {
38            int t = getIntFromStr(MTempValue.substring(01));
39            MTempValue = MTempValue.substring(1);
40            temp = temp * M + t;
41            Shang += getStrFromInt(temp / N);
42            temp = temp % N;
43        }
44        while(Shang.length() > 0 && Shang.charAt(0) == '0'){
45            Shang = Shang.substring(1);
46        }
47        return getStrFromInt(temp);
48    }
49 
50    public static int getIntFromStr(String str){
51        return str.charAt(0) <= '9' && str.charAt(0) >= '0'?
52            str.charAt(0) - '0' : str.charAt(0) - 'a' 10;
53    }
54 
55    public static String getStrFromInt(int value){
56        String result = null;
57        if(value>=0 && value<=9)
58            result = String.valueOf((char)('0' + value));
59        else if(vlaue > 9 && value <36)
60        {
61            result = String.valueOf((char)('a' + value - 10));
62        }
63        else
64        {
65            result = "-1";// 出错误了
66        }
67        return result;
68    }
69}

赵大叔的算法好了不少,除了参数检查,大小写之外都很好。值得我们借鉴。 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值