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

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

园子里有很多深藏不漏的高手,在这里聊这种基本问题是有点小儿科。不过本人只是想分享下自己的新的,代码,算法有不足之处,还请大家指正,共同进步。

 

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

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

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void m2n( int m, char * mNum, int n, char * nNum) 
{
     int i = 0;
     char c, *p = nNum;
  
     //这是一个考察地方,是否能用最少乘法次数。
     while (*mNum != '\0' )
         i = i*m + *mNum++ - '0' ;
      
     //辗转取余
     while (i) {
         *p++ = i % n + '0' ;
         i /= n;
     }
     *p-- = '\0' ;
  
     //逆置余数序列
     while (p > nNum) {
         c = *p;
         *p-- = *nNum;
         *nNum++ = c;
     }
}

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

 

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

 

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

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

你可能感兴趣的:(m进制转换为n进制-任意进制转换算法)