【蓝桥杯】基础练习 十六进制转八进制(Java实现)

试题 基础练习 十六进制转八进制

资源限制
时间限制:1.0s 内存限制:512.0MB


问题描述   给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、 大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

分析

题中说了“每个十六进制数长度不超过100000”,这个长度哪怕是long类型也容纳不下,所以不能先转换成10进制,再转换成8进制。
具体16 -》2-》8

Java代码实现

package cn.com.codingce.lq.base;

import java.util.Scanner;

public class HexadecimalToOctal {
    
    
    // 定义常量字符串
    static String[] bin = {
    
    "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
            "1011", "1100", "1101", "1110", "1111"};

    static String[] otc = {
    
    "0", "1", "2", "3", "4", "5", "6", "7"};

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // n个十六进制正整数
        String[] str = new String[n]; // 接收十六进制正整数的数组

        // 接收十六进制正整数
        for (int i = 0; i < n; i++) {
    
    
            str[i] = sc.next();
        }

        for (int i = 0; i < n; i++) {
    
    
            String result = hexToBin(str[i]).toString();
            String octResult = binToOct(result.toString());
            if (octResult.startsWith("0")) {
    
    
                octResult = octResult.substring(1);
                // substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。
                // 该子字符串从指定索引处的字符开始,直到此字符串末尾。
            }
            System.out.println(octResult);
        }

    }

    // 十六进制转换成二进制
    @SuppressWarnings("unused")
    private static StringBuffer hexToBin(String str) {
    
    
        int length = str.length();
        int start = 0;
        int end = 1;
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < length; i++) {
    
    
            /*
             * substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。 该子字符串从指定的
             * beginIndex 处开始,直到索引 endIndex - 1 处的字符。 因此,该子字符串的长度为 endIndex-beginIndex。
             */
            String subStr = str.substring(start, end); // 抽取一个十六进制字符
            start++;
            end++;
            String s = transform(subStr); // 将抽取的十六进制字符转换成二进制字符
            result.append(s);
        }
        return result;
    }

    // 二进制转换成八进制
    @SuppressWarnings("unused")
    private static String binToOct(String str) {
    
    
        int length = str.length();
        /*
         * 二进制字符串的长度不是3的整数倍的时候,就要在字符串的前面补上相应个数的 ‘0’ 来让二进制字符串的长度变成3的整数倍
         */
        if (length % 3 == 1) {
    
    
            str = "00" + str;
        } else if (length % 3 == 2) {
    
    
            str = "0" + str;
        }

        int start = 0;
        int end = 3;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length() / 3; i++) {
    
    
            String subStr = str.substring(start, end); // 抽取三个二进制字符
            start += 3;
            end += 3;
            String s = transform2(subStr); // 将抽取的二进制字符串转换成八进制字符
            sb.append(s);
        }
        return sb.toString();
    }

    /**
     * 将抽取的十六进制字符转换成二进制字符
     *
     * @param str
     * @return
     */
    @SuppressWarnings("unused")
    private static String transform(String str) {
    
    
        String result = "";
        switch (str) {
    
    
            case "0":
                result = bin[0];
                break;
            case "1":
                result = bin[1];
                break;
            case "2":
                result = bin[2];
                break;
            case "3":
                result = bin[3];
                break;
            case "4":
                result = bin[4];
                break;
            case "5":
                result = bin[5];
                break;
            case "6":
                result = bin[6];
                break;
            case "7":
                result = bin[7];
                break;
            case "8":
                result = bin[8];
                break;
            case "9":
                result = bin[9];
                break;
            case "A":
                result = bin[10];
                break;
            case "B":
                result = bin[11];
                break;
            case "C":
                result = bin[12];
                break;
            case "D":
                result = bin[13];
                break;
            case "E":
                result = bin[14];
                break;
            case "F":
                result = bin[15];
                break;
            default:
                break;
        }
        return result;
    }

    /**
     * 将抽取的二进制字符串转换成八进制字符
     *
     * @param str
     * @return
     */
    @SuppressWarnings("unused")
    private static String transform2(String str) {
    
    
        String result = "";
        switch (str) {
    
    
            case "000":
                result = otc[0];
                break;
            case "001":
                result = otc[1];
                break;
            case "010":
                result = otc[2];
                break;
            case "011":
                result = otc[3];
                break;
            case "100":
                result = otc[4];
                break;
            case "101":
                result = otc[5];
                break;
            case "110":
                result = otc[6];
                break;
            case "111":
                result = otc[7];
                break;

            default:
                break;
        }

        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43874301/article/details/114575753