算法通关村第十三关青铜挑战——进制问题解析

大家好,我是怒码少年小码。

今天是进制转换的主场!!

七进制数

LeetCode 504: 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1:

  • 输入: num = 100
  • 输出: “202”

示例 2:

  • 输入: num = -7
  • 输出: “-10”

提示:类比十进制数转二进制数一样。例如——十进制数 201 转为七进制数:

201 ÷ 7 = 28 余 5
28 ÷ 7 = 4 余 0
4 ÷ 7 = 0 余 4

所以201的七进制数是 405。将余数的逆序组成就是答案,于是我们可以先用一个字符串保存余数,如果num原来小于0我们还可以在字符串的末尾添上一个符号,然后反转字符串得到答案。

 string convertToBase7(int num) {
       if(num == 0){
           return "0";
       }
       bool negative = num < 0; //输入的值是否小于零
       num = abs(num);  //取绝对值
       string digits;  //记录最终结果的逆序
       while(num > 0){
           digits.push_back(num % 7 + '0');
           num /= 7;
       }
       if(negative){
           digits.push_back('-'); //在末尾插入符号
       }
       reverse(digits.begin(),digits.end());  //反转
       return digits;
    }

进制转换

给定一个十进制数M,以及需要转换的进制数N,将十进制数M转化为N进制数。M是32位整数,2<=N<=16
这个题目的思路不复杂,但是想写正确却很不容易,甚至越写越糊涂。本题有好几个需要处理的问题:

  • 1.超过进制最大范围之后如何准确映射到其他进制,特别是ABCDEF这种情况。简单的方式是大量采用if判断,但是这样会出现写了一坨,最后写不下去。
  • ⒉.需要对结果进行一次转置。。3.需要判断负号。

下面这个是我总结出的实现方案。注意采取三个措施来方便处理:

  • 1.定义大小为16的数组F,保存的是2到16的各个进制的值对应的标记,这样赋值时只计算下标,不必考虑不同进制的转换关系了。
  • 2.使用StringBuffer完成数组转置等功能,如果不记得这个方法,工作量直接飙升。
  • 3.通过—个flag来判断正数还是负数,最后才处理。

代码使用Java写的:

class Solution {
    // 定义一个存放2~16进制所有对应值的数组
    public static final String[] F = {"0","1","2","3","4","5",
        "6","7","8","9","A","B","C","D","E","F"}
    //将十进制数M转为N进制数
    public String convert(int M, int N) {
        // 保存正负号
        boolean flag = false;
        if(num < 0){
            flag = true;
            M *= -1;
        }; // 先化成正数处理
        StringBuffer sb = new StringBuffer();
        // 循环取余和整除
        int tmp;
        while(M != 0){
            tmp = M % N; //通过数组F解决了不同进制之间映射的问题
            sb.append(F[tmp]); 
            M /= N;
        }
        //使用StringBuffer的reverse函数一步反转
        sb.reverse();
        // 最后处理正负
        return (flag ? "-" : "") + sb.toString();
    }
}

你可能感兴趣的:(算法学习,算法)