day7.12

题目:

进制转换。

思路:

先把十六进制转换为二进制,再通过二进制转换为八进制,这样就完成了进制转换。

代码:

public class Data12 {


    public static void main(String[] args) {
    Scanner sca = new Scanner(System.in);
    String input_n = sca.nextLine();
    int n = Integer.parseInt(input_n);

    // 接受输入十六进制数的字符串
    String[] input_nums = new String[n];
    for (int i = 0; i < n; i++) {
        input_nums[i] = sca.nextLine();
    }
    sca.close();
    // 十六进制表
    String[] HEXs = {
            "0", "1", "2", "3", "4", "5", "6", "7",
            "8", "9", "A", "B", "C", "D", "E", "F"
    };
    // 二进制表
    String[] BINs = {
            "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
            "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
    };
    // 八进制表
    String[] OCTs = {
            "0", "1", "2", "3", "4", "5", "6", "7"};

    for (int m = 0; m < n; m++) { // 遍历每个十六进制数字
        String hex = input_nums[m]; // 十六进制表示形式
        StringBuffer sbBin = new StringBuffer();
        StringBuffer sbOct = new StringBuffer();

        // 十六进制转二进制
        // 将十六进制数每一位转换成四位的二进制数字
        for (int i = 0; i < hex.length(); i++) { // 遍历每个十六进制位
            String c = Character.toString(hex.charAt(i));
            // 查询当前位字符在 HEXs中的下标
            int index = Arrays.binarySearch(HEXs, c);
            sbBin.append(BINs[index]);
        }

        // 在二进制数前面插入若干个"0",使得二进数的位数为 3 的倍数
        while (sbBin.length() % 3 != 0) {
            sbBin.insert(0, "0");
        }
        int octLen = sbBin.length() / 3; // 计算目标八进制数的长度
        // 每次取三位二进制数,转换成对应的八进制
        for (int i = 0; i < octLen; i++) {
            String span = sbBin.substring(3 * i, 3 * i + 3);
            int index = Arrays.binarySearch(BINs, "0" + span);
            sbOct.append(OCTs[index]);
        }
        // 此时已经得到结果,需要去除前导 0
        while (sbOct.charAt(0) == '0') {
            sbOct.delete(0, 1);
        }
        System.out.println(sbOct.toString());
    }
}
}
posted @ 2021-07-14 18:16  头秃准备  阅读(29)  评论(0)    收藏  举报