蓝桥杯之基础练习 十六进制转八进制

题目:基础练习 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

答案:

import java.util.Scanner;

public class Main
{
    public static void toBinaryTransform(int n, char[][] arry, String[] arryBinaryStr)
    {//(个数,二进制数,放对应的二进制)
        String[] arryOctalStr = new String[10];
        String str = "";
        StringBuilder octalStb = new StringBuilder();
        StringBuilder binaryStb = new StringBuilder();
        /*
         * String[] arryOctalBinaryStr = { "000", "001", "010", "011", "100", "101",
         * "110", "111" };
         */
        int i, j, k, len;
        for (i = 0; i < n; i++)
        {
            arryBinaryStr[i] = "";
            arryOctalStr[i] = "";
            len = arry[i].length;//当前十六进制数的一维字符数组的长度
            //将当前十六进制数转为二进制,放入StringBuilder  的    binaryStb中
            for (j = 0; j < len; j++)
            { // Convert Hex into Binary  从头开始进行转化
                switch (arry[i][j])
                {
                case '0':
                    binaryStb.append("0000");
                    break;
                case '1':
                    binaryStb.append("0001");
                    break;
                case '2':
                    binaryStb.append("0010");
                    break;
                case '3':
                    binaryStb.append("0011");
                    break;
                case '4':
                    binaryStb.append("0100");
                    break;
                case '5':
                    binaryStb.append("0101");
                    break;
                case '6':
                    binaryStb.append("0110");
                    break;
                case '7':
                    binaryStb.append("0111");
                    break;
                case '8':
                    binaryStb.append("1000");
                    break;
                case '9':
                    binaryStb.append("1001");
                    break;
                case 'A':
                    binaryStb.append("1010");
                    break;
                case 'B':
                    binaryStb.append("1011");
                    break;
                case 'C':
                    binaryStb.append("1100");
                    break;
                case 'D':
                    binaryStb.append("1101");
                    break;
                case 'E':
                    binaryStb.append("1110");
                    break;
                case 'F':
                    binaryStb.append("1111");
                    break;
                default:
                    break;
                }
            }
//          将当前十六进制的二进制的String放入管理所有的二进制的arryBinaryStr   String数组中
            arryBinaryStr[i] = binaryStb.toString();
//          清空刚刚临时存放二进制的  binaryStb
            binaryStb = new StringBuilder();
//          对刚刚放入管理所有二进制的数组的二进制进行位数上的处理,调整位数,长度不能整除3,则在前头补0
            if (arryBinaryStr[i].length() % 3 == 1)
            { // Correct the Binary in order to convert it into Octal.
                arryBinaryStr[i] = "00" + arryBinaryStr[i];
            }
            else if (arryBinaryStr[i].length() % 3 == 2)
            {
                arryBinaryStr[i] = "0" + arryBinaryStr[i];
            }
//          获得当前十六进制的二进制的处理好的位数
            len = arryBinaryStr[i].length() / 3;
//          取得当前十六进制的八进制的位数,开始进行二进制转八进制
            for (j = 0; j < len; j++)
            { // Convert Binary into Octal
//              三位数三位数地转换,从头开始进行转化
                str = arryBinaryStr[i].substring(j * 3, j * 3 + 3);
                /*
                 * for (k = 0; k <= 7; k++) { if (str.equals(arryOctalBinaryStr[k])) {
                 * octalStb.append(k); } }
                 */
                switch (str)
                {
                case "000":
                    octalStb.append("0");
                    break;
                case "001":
                    octalStb.append("1");
                    break;
                case "010":
                    octalStb.append("2");
                    break;
                case "011":
                    octalStb.append("3");
                    break;
                case "100":
                    octalStb.append("4");
                    break;
                case "101":
                    octalStb.append("5");
                    break;
                case "110":
                    octalStb.append("6");
                    break;
                case "111":
                    octalStb.append("7");
                    break;
                }
            }
//          把临时结果octalStb的toString放进管理所有的八进制的arryOctalStr数组中
            arryOctalStr[i] = octalStb.toString();
//          清空临时区域 octalStb
            octalStb = new StringBuilder();
//          取当前得到的八进制数的首位,看看其是否为0,若为0,则不打印出首位,得到一个就打印一个八进制
            str = arryOctalStr[i].substring(0, 1);
            if (str.equals("0"))
            { // Remove the first zero and print Octal.
                System.out.println(arryOctalStr[i].substring(1, arryOctalStr[i].length()));
            }
            else
            {
                System.out.println(arryOctalStr[i]);
            }
        }
    }

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//读取行数
        char[][] arry = new char[10][100000];
        String[] arryBinaryStr = new String[10];
        String number;//存放十六进制的数的字符串
        if (n >= 1 && n <= 10)
        {
            for (int i = 0; i < n; i++)
            {
                number = sc.next();
                arry[i] = number.toCharArray();//将十六进制的数的字符串转为一维字符数组,放入二维数组中
//              System.out.println("````````````"+number.toCharArray()[0]);

            }
            toBinaryTransform(n, arry, arryBinaryStr);//将二维数组中的十六进制数转为二进制,二进制再转八进制;(个数,二进制数,放对应的二进制),从头开始转换
        }
    }
}

个人小结:

进制之间的转换:
https://baike.baidu.com/item/%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2/3117222?fr=aladdin

猜你喜欢

转载自blog.csdn.net/qq_37905259/article/details/80570597