进制转换

描述

给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。若 M 为负数,应在结果中保留负号。

方法一(递归)

思路分析

本题需要将十进制M数转换为N进制,接着我们通过几个例子对其进行分析:
  • 我们首先分析N=2,M=10的情况,如果我们需要将十进制数10转换为二进制数,我们要做的就是不断的将10对2进行整除,直到商小于2,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为二进制数。
  • 我们分析当N=8,M=1000的情况,如果我们需要将十进制数1000转换为八进制数,我们要做的就是不断的将1000对8进行整除,直到商小于8,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为八进制数。
  • 我们分析当N=16,M=10000的情况,如果我们需要将十进制数10000转换为十六进制数,我们要做的就是不断的将10000对16进行整除,直到商小于16,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为十六进制数,需要注意的是我们需要将余数大于 10 的一位使用大写字母表示,例如10使用A表示等等。
通过分析我们得到一般性的结论十进制数在转换成任何进制数时,均为除其进制取余,因为中间过程涉及逆序输出,因此使用递归的办法比较有效。需要注意的是当M小于0时,对其取负进行计算,最后增加负号即可。

图解

思路分析中的图解如下:

核心代码

import java.util.*;


public class Solution {
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    static String s=new String();
    public static void convert(int n,int b) {
		if(n>0) 
        {
			switch(n%b) {
			case 10:s="A"+s;break;
			case 11:s="B"+s;break;
			case 12:s="C"+s;break;
			case 13:s="D"+s;break;
			case 14:s="E"+s;break;
			case 15:s="F"+s;break;
			default:s=String.valueOf(n%b)+s;
			}
		}
		if(n!=0) {
			convert(n/b,b);
		}
	}    
    public String solve (int M, int N) {
        // write code here
        int index=1;//判断正负数标志
        if(M<0) 
        {
            M=-M; 
            index=-1;
        } 
        convert(M,N);
        if(index==-1) s="-"+s;
        return s;
    }
}
复杂度分析
  • 时间复杂度:对M不断的整除N,因此时间复杂度为
  • 空间复杂度:该算法使用递归操作,递归过程中使用栈,栈空间为,因此时间复杂度为

方法二+迭代

思路分析

方法二是对方法一的改变,将递归过程转换为迭代过程,即不断的对M进行整除,然后将余数再次赋值给M,迭代的思想更易理解。

核心代码

import java.util.*;


public class Solution {
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    static String s=new String();
    public static void convert(int n,int b) {
		while(n>0) 
        {
			switch(n%b) {
			case 10:s="A"+s;break;
			case 11:s="B"+s;break;
			case 12:s="C"+s;break;
			case 13:s="D"+s;break;
			case 14:s="E"+s;break;
			case 15:s="F"+s;break;
			default:s=String.valueOf(n%b)+s;
			}
            n=n/b;
		}
	}    
    public String solve (int M, int N) {
        // write code here
        int index=1;//判断正负数标志
        if(M<0) 
        {
            M=-M; 
            index=-1;
        } 
        convert(M,N);
        if(index==-1) s="-"+s;
        return s;
    }
}
复杂度分析
  • 时间复杂度:对M不断的整除N,因此时间复杂度为
  • 空间复杂度:程序必要的空间为存储生成的N进制数,与方法一不同,因此空间复杂度$O(1)$