m进制转换为n进制-任意进制转换算法(百度面试题)
2010-10-27 13:07 码农1946 阅读(20017) 评论(4) 编辑 收藏 举报代码下载:进制转换代码
园子里有很多深藏不漏的高手,在这里聊这种基本问题是有点小儿科。不过本人只是想分享下自己的新的,代码,算法有不足之处,还请大家指正,共同进步。
这种题也是一道经典的面试题,主要考察进制转换细想,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; } } |
赵大叔的算法好了不少,除了参数检查,大小写之外都很好。值得我们借鉴。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?