算法通关村十三关 | 进制转换问题处理模板

1. 七进制数

题目:LeetCode504:504. 七进制数 - 力扣(LeetCode)

算法通关村十三关 | 进制转换问题处理模板_第1张图片

 思路

        进制转换,对几转换就是对几求余,最后将所有的余数反过来即可、如果num< 0,先取绝对值,再进行操作。

100转7进制的过程:

算法通关村十三关 | 进制转换问题处理模板_第2张图片

代码 

    public static String convert(int num){
        StringBuilder sb = new StringBuilder();
        //先拿到正负号,对其转换为正数
        boolean sign = num < 0;
        if (sign){
            num *= -1;
        }
        while (num > 0){
            sb.append( num%7 +"");
            num/=7;
        }
        if (sign)
            sb.append("-");
        return sb.reverse().toString();
    }

2. 进制的转换

题目

        给定一个十进制数M,以及需要转换的进制数N,将十进制数转化为N进制数,M是32位整,2<= N <=16。

思路

需要处理的几个问题

  1. 进制数超过范围的时候出现A,B,C,D,E,F。我们可以定义长度大小为16的数组,保存2到16进制对应值的标记,赋值的时候只计算下标,不考虑不同进制的转换,
  2. 使用StringBuild完成字符串的反转。
  3. 用flag标记正负号,最后处理。

代码

    //1.余数大于9的情况,
    public static final String[] F = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    public static String convertn(int M, int N){
        Boolean flag = false;
        if (M<0){
            flag = true;
            M *= -1;
        }
        StringBuffer sb = new StringBuffer();
        int temp;
        while (M != 0){
            //2.整除和取余,第一位余数先获取。
            temp = M%N;
            sb.append(F[temp]);
            M=M/N;
        }
        sb.reverse();
        return (flag?"-":"+") + sb;
    }

3. 补充

整数溢出问题

判断是否是大于最大32位整数,要从最大数/10开始判断,最大数是2147483647。

  • 如果num>214748364,那么后面就不用再判断肯定溢出了,
  • 如果num=214748364,需要跟最大数的末尾数字7对比,如果大于7,则溢出
  • 如果num<214748364,则没问题继续处理

代码

        if (num >Integer.MAX_VALUE / 10 || num == Integer.MAX_VALUE && num%10 > 7){
            return 0; 
        }
        if (num < -Integer.MAX_VALUE / 10 || num == -Integer.MAX_VALUE && num%10 < -8){
            return 0;
        }

你可能感兴趣的:(算法通关村专栏,算法,数据结构)