`
pkuoliver
  • 浏览: 19401 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

m进制转换为n进制-任意进制转换算法(百度面试题)

阅读更多

代码下载:进制转换代码

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

 

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

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

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

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的计算器也转不了的大数,这个算法也可以转。算和上面的算法相比,他的基本思想不变,还是辗转除,但是用了字符串做大数相除,很不错的创新点,赞一个。代码如下:

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)('0'+ value);
		else if(vlaue > 9 && value <36)
		{
			result = (String)('0'+ value - 10);
		}
		else
		{
			result = “-1”;//出错误了
		}
		return result;
	}
}
 

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

讨论更好的方法

分享到:
评论
1 楼 xudanhui 2010-10-27  
M<N的时候,不能算的啊。。
字符串拼接的操作,我对效率很怀疑。

相关推荐

    c++进制转换试题可以进行10->2范围转换

    题目所提及的“c++进制转换试题可以进行10-&gt;2范围转换”指的是将十进制数字转换为二进制数字。下面将详细探讨这个主题,包括基本概念、C++中的转换方法以及实现过程。 一、进制转换基础 进制是数字系统的基础,...

    C语言-顺序栈实现十进制转换为二进制-八进制-十六进制

    ### C语言顺序栈实现十进制到二进制、八进制、十六进制的转换 #### 一、概述 本篇文章将详细介绍如何使用C语言中的顺序栈来实现十进制数字向二进制、八进制以及十六进制的转换。通过分析给出的代码示例,我们将...

    STM32数据进制转换程序,移植方便

    STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计中。在STM32的开发过程中,常常需要处理不同进制之间的数据转换,例如将二进制、八进制、十进制和十六进制等进行相互转换。这个“STM32数据...

    PB进制转换函数(2-36进制任意转换)

    标题中的“PB进制转换函数(2-36进制任意转换)”指的是在PowerBuilder(简称PB)环境中实现的一种编程功能,它允许程序员将数字在2到36之间的任意进制之间进行转换。这种功能在处理数据编码、解码、算法实现以及与...

    易语言模块完全进制转换.rar

    - 高精度计算:深入研究大数运算和高精度进制转换算法。 - 性能优化:对比内置函数与模块性能,优化代码执行效率。 综上所述,“易语言模块完全进制转换”是易语言编程中的一大助力,它简化了进制转换的操作,...

    易语言任意进制转换

    在易语言中进行任意进制转换是常见的编程任务之一,这涉及到数字系统的基础理论以及易语言的语法特性。 在数字系统中,我们通常使用的十进制只是众多进制中的一种。二进制、八进制、十六进制等也是常见的表示方式,...

    进制转换 把一个任意的十进制正整数 N 转换成 d 进制数。 N 是一个正整数,d 是一个大于 1 小于 10 的整数,二者均由用户输入,且两数字用换行分隔。

    常用的进制包括二进制(2进制)、八进制(8进制)、十进制(10进制)和十六进制(16进制)。在这个题目中,我们需要将一个十进制的正整数转换为另一个d进制数,其中d的范围是2到9。 ### 2. C语言基础知识 #### 2.1...

    二进制八进制十进制十六进制之间的转换算法.pdf

    "二进制八进制十进制十六进制之间的转换算法" 本文主要讲解了二进制、八进制、十进制、十六进制之间的转换算法。包括十进制与二进制之间的转换、八进制与二进制之间的转换、十六进制与二进制之间的转换等。 十进制...

    大数16进制向10进制转换

    在编程和计算过程中,经常需要将16进制的大数转换为10进制的大数。下面将详细介绍这个转换过程及其背后的原理。 1. **16进制与10进制的表示** - 16进制(Hexadecimal)是一种逢16进1的计数方式,使用0-9和A-F这16...

    十进制数转换成1-9进制 数据结构 c语言编译

    printf("转换为%d进制的内容是:\n", e); scanf("%d", &e); // 此处应注释掉或修改,因为e的值应固定为9,而不是从用户输入获取 int str[15]; do { str[m] = input % e; // 计算余数并存储 input = input / e...

    数据结构与算法分析堆栈的操作二进制转换为其他进制

    数据结构与算法分析堆栈的操作二进制转换为其他进制

    Delphi进制转换,十进制,二进制,十六进制,字符串--超短精简

    本文将深入解析Delphi中关于十进制、二进制、十六进制以及字符串之间的转换方法,旨在为程序员提供实用且精炼的代码示例。 ### 十进制转其他进制 #### 十进制转二进制 在Delphi中,将一个整数转换成二进制字符串...

    C++任意进制转换

    例如,将一个整数转换为任意进制: ```cpp #include #include #include std::vector&lt;int&gt; decimalToCustomBase(int number, int base) { std::vector&lt;int&gt; result; while (number &gt; 0) { result.push_back...

    基于单片机(AT89C51)的进制转换及进制计算器.rar

    综上所述,"基于单片机(AT89C51)的进制转换及进制计算器"项目涵盖了单片机原理、进制转换算法、程序设计、硬件接口设计等多个方面的知识。通过这个项目,开发者不仅可以提升单片机编程技能,还能深入理解进制转换的...

    C语言进制转换,十进制转16进制

    例如,要将十进制数423转换为十六进制,我们执行以下步骤: - 423 ÷ 16 = 26 ... 7 - 26 ÷ 16 = 1 ... 10 - 1 ÷ 16 = 0 ... 1 对应的十六进制字符为'7', 'A', '1',组合起来即为"1A7"。 在实际的C语言代码中,...

    二进制转换为十进制(Verilog代码)

    本段落将详细解释如何通过 Verilog 代码将32位二进制数转换为十进制数。 首先,我们需要了解 Verilog 是一种硬件描述语言,用于设计和验证数字系统的逻辑。在给定的代码中,`module b32_o(bdata, odata)`定义了一个...

    任意进制转换(2-62)易语言源码

    "任意进制转换(2-62)" 易语言源码提供了一种解决方案,允许用户将数值在2到62之间的任意进制之间进行转换。易语言是一种以中文为编程语法的编程语言,它旨在降低编程门槛,使更多人能够理解和使用编程。 进制转换的...

    js 实现 十六进制转换为十进制

    js 实现 十六进制转换为十进制! 值得下载看看!资源免费,大家分享!!

    C#16进制转换10进制

    例如,我们可以使用相同的`Convert.ToString`方法将数字转换为任意进制的字符串,如将10进制数69转换为2进制、8进制和16进制: ```csharp Console.WriteLine(Convert.ToString(69, 2)); // 输出 "100111101" ...

    报文传输中的进制转换(十六进制、二进制)

    而将十进制转换为十六进制,则可以先转换为二进制,再分组,每四位转换为一个十六进制数字。 这个C++项目可能就是一个实用工具,用户输入一个十进制数,程序会输出其对应的二进制表示,有助于理解和学习进制转换的...

Global site tag (gtag.js) - Google Analytics