【转自】——http://www.cnblogs.com/pkuoliver/archive/2010/10/27/Convert-m-number-to-n-number.html
这种题也是一道经典的面试题,主要考察进制转换细想,Coding质量等。
当我们把十进制转成二进制的时候,我们通过辗转相除,取余,逆置余数序列的过程得到新的进制的数。因此我们可以借助这种思想把M进制转成N进制的数。
如下是C的详细的实现方法
01 | void 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的计算器也转不了的大数,这个算法也可以转。算和上面的算法相比,他的基本思想不变,还是辗转除,但是用了字符串做大数相除,很不错的创新点,赞一个。代码如下:
01 | package test; |
02 |
03 | /** |
04 | * 功能:将一个数从M进制转换成N进制 |
05 | * MValue:M进制数的字符串表示方法 |
06 | * Shang:保存中间运算结果 |
07 | * M:M进制 |
08 | * N:N进制 |
09 | */ |
10 | public 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(0, 1)); |
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 | } |
赵大叔的算法好了不少,除了参数检查,大小写之外都很好。值得我们借鉴。
本文介绍了一种从M进制到N进制的转换方法,并提供了两种不同的实现方式:一种使用C语言,另一种使用Java语言处理大数转换的问题。两种方法都遵循了辗转相除的基本原理。

1484

被折叠的 条评论
为什么被折叠?



