这种题也是一道经典的面试题,主要考察进制转换细想,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.valueOf((char)(\'0\' + value));else if (value > 9 && value < 36){result = String.valueOf((char)(\'a\' + value - 10));}else{result = "-1";// 出错误了}return result;}
}

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

以上转自http://blogread.cn/it/article/3302?f=wb

本人愚钝,研究了一段时间才完全弄明白里面的原理。第一个算法是转换成十进制,再辗转相除取余,最后逆置余数序列得到结果。第二个算法是直接对原数据,用目标进制n直接进行辗转相除,取商和取余。相对于第一个算法,去掉了前面整个数据转换成十进制的操作(当然计算机默认操作数是十进制,所以每取一位还是先要先转换为十进制)。

下面是本人用C语言改写的:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_CONVERT_NUM_LEN 50
char m2n(char m, char n, char *mNum, char *nNum)
{char *np=nNum;char JINZHI[37] ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";unsigned int dec;char shang[MAX_CONVERT_NUM_LEN], tt[MAX_CONVERT_NUM_LEN];char *sp, *tp;char getm, temp;if(m<2 || m>36 || n<2 || n>36)return -1;strcpy(shang, mNum);sp = shang;while(*sp != '\0'){dec = 0;*tt = '\0';    tp = tt;while(*sp != '\0'){getm = *sp > '9' ? (toupper(*sp++)-'A'+10) : ((*sp++)-'0');if(getm < 0 || getm >= m )return -1;dec = dec * m + getm;if((temp=dec/n) != 0 || *tp != '\0')*tp++ = JINZHI[temp];dec %= n;}*np++ = JINZHI[dec];*tp = '\0';strcpy(shang, tt);sp = shang;}*np-- = '\0';while(np>nNum){temp =*np;*np-- =*nNum;*nNum++ = temp;}return 0;
}int main(int argc, char **argv)
{char *m="123004560007890000abcdEF";char n[MAX_CONVERT_NUM_LEN];if(strlen(m) > 0 && 0 == m2n(16, 10, m, n))printf("%s \n",n);elseprintf("error!!!\n");system("pause");return 0;
}

m进制转换为n进制-任意进制转换算法相关推荐

  1. C#中,将16进制转换为有符号的10进制的方法(支持带0x标志,支持任意字符串)

    /// <summary>         /// 将16进制转换为有符号的10进制         /// </summary>         /// <param ...

  2. 74ls390设计任意进制计数器,基于74LS192的任意进制计数器的设计

    基于74LS192的任意进制计数器的设计 [摘要]利用集成二.十进制计数器采用置数法.置零法设计任意进制计数器,分析设计方法,给出设计案例.以集成计数器74LS192为例,运用置零法和置数法设计八进制 ...

  3. 进制转换【最全进制转换汇总】(整数_小数_正数_负数)正负数整数小数十进制转任意进制-正负数整数小数任意进制转十进制-正负数低进制转高进制-正负数高进制转低进制

    文章目录: 补充知识点:各进制符号表示及其关系--二进制(B).八进制(O).十进制(D).十六进制(前缀OX,后缀H) 扩展:在线进制转换 第一部分:正数 一:[整数]正数十进制转任意进制:辗转相除 ...

  4. js模拟栈---进制转化。十进制转任意进制进制,任意进制转十进制

    var Stack = (function(){var items = new WeakMap();//先入后出,后入先出class Stack{constructor(){items.set(thi ...

  5. c++语言将任意进制转化10进制,C++ 基础编程之十进制转换为任意进制及操作符重载...

    C++ 基础编程之十进制转换为任意进制及操作符重载 最近学习C++ 的基础知识,完成十进制转换为任意进制及操作符重载,在网上找的不错的资料,这里记录下, 实例代码: #include #include ...

  6. 任意进制转换为十进制(十六进制转换为十进制)

    一.十六进制转换为十进制 unsigned long HextoDec(char *hex, int length) {int i;unsigned long rslt = 0;for (i = 0; ...

  7. JS将十进制转换为二进制、十六进制、八进制,任意进制

    JS将十进制转换为2进制.16进制.8进制,任意进制 转换为二进制 let n = 1234; console.log(n.toString(2)); 转换为十六进制 let n = 1234; co ...

  8. 关于java实现十进制转换为任意进制

    这原本是Noip2000的一个题目 https://www.luogu.com.cn/problem/P1017 被我们的伟大的唯心主义编程大师拿来当成了作业题,我正好复习一下进制问题 首先十进制转换 ...

  9. 进制转换:十进制转换为任意进制、任意进制转换为十进制

    目录 十进制转换为任意进制 任意进制转换为十进制 十进制转换为任意进制 //将10进制数num转换为d进制数 void convert_base(int num, int d) {int k;stac ...

  10. python任意进制转换界面_python:整数转换为任意进制(

    javascript提供了一个number.toString(baseNum)的函数,能够将number转换为36进制以下的字符串. python里面仅提供了将字符串转换为整数的函数,并没有提供相应的 ...

最新文章

  1. 《预训练周刊》第21期:FlipDA:有效且稳健的数据增强小样本学习、开放域低资源适应的生成式聊天机器人...
  2. 我要放弃RedHat Linux了
  3. Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动
  4. kali linux2.0下MariaDB修改密码
  5. hexo version control
  6. 防止用户删除数据库表
  7. Java和jsp编程中应该注意的几个常见问题
  8. 关于SQL注入及防御
  9. 带你画uml系统用例图
  10. 大一入门oj题目——《三天以后》
  11. PC微信多开源代码-消息钩子+ZwQuerySystemInformation
  12. yaaw 错误 “No such method: aria2.addTorrent”的解决办法
  13. windows下视频捕捉VFW和DirectShow
  14. 什么叫做股票实时行情接口api?
  15. 流程图 FlowChart
  16. python语言编程是什么意思_python中的“//”是什么意思
  17. 有没有html做的平安夜页面或者圣诞节,送给同学的平安夜圣诞节祝福语
  18. 好程序员分享MySQL之SQL入门(一)
  19. from batchgenerators.transforms import ComposeImportError: cannot import name ‘Compose‘ from ‘batch
  20. 环信即时通讯云iOS版V2.0.9.1服务评测

热门文章

  1. 旧的华为手机刷Android9,华为老机型内测安卓9.0,这更新速度快到没谁了!
  2. 前端八股文(Vue部分) -不断更新
  3. Oracle笔记 之 查看表空间使用情况
  4. UE4 几个好用的插件和Wiki教程
  5. Runnable接口和Callable接口的区别
  6. 基于OpenCV的图片和视频人脸识别
  7. java deepcopy_详解JAVA 深层拷贝 DeepCopy的使用方式
  8. 收下这份十万商家称赞的开店攻略,带你发家致富!
  9. 【Python】可迭代对象与迭代器
  10. csp 201512-2 消除类游戏