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

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
  2
  39
  123ABC
样例输出
  71
  4435274
  【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String[] a = new String[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.next();
        }
        scanner.close();
        for (int i = 0; i < n; i++) {
            String a1 = HexadecimalToBinarySystem(a[i]);//转成二进制

            if ((a1.length() % 3) == 1) {//如果不够3整除的话,就在后面补上0
                a1 = "00" + a1;//补0要放在前面才不会改变原来的数值
            }
            if ((a1.length() % 3) == 2) {
                a1 = "0" + a1;
            }
            String a2 = BinarytoOcal(a1);//二进制转八进制
            System.out.println(a2);
        }

    }

    public static String HexadecimalToBinarySystem(String a) {
        StringBuffer b = new StringBuffer();
        for (int i = 0; i < a.length(); i++) {
            switch (a.charAt(i)) {
                case '0':
                    b.append("0000");
                    break;
                case '1':
                    b.append("0001");
                    break;
                case '2':
                    b.append("0010");
                    break;
                case '3':
                    b.append("0011");
                    break;
                case '4':
                    b.append("0100");
                    break;
                case '5':
                    b.append("0101");
                    break;
                case '6':
                    b.append("0110");
                    break;
                case '7':
                    b.append("0111");
                    break;
                case '8':
                    b.append("1000");
                    break;
                case '9':
                    b.append("1001");
                    break;
                case 'A':
                    b.append("1010");
                    break;
                case 'B':
                    b.append("1011");
                    break;
                case 'C':
                    b.append("1100");
                    break;
                case 'D':
                    b.append("1101");
                    break;
                case 'E':
                    b.append("1110");
                    break;
                case 'F':
                    b.append("1111");
                    break;
                default:
                    break;

            }
        }
        return b.toString();
    }

    public static String BinarytoOcal(String b) {
        int k;
        if (b.substring(0, 3).equals("000")) k = 3;//如果前面三个是000的话,则不让输出0
        else k = 0;
        StringBuffer bb = new StringBuffer();
        for (int i = k; i < b.length() - 2; i = i + 3) {
            switch (b.substring(i, i + 3)) {
                case "000":
                    bb.append('0');
                    break;
                case "001":
                    bb.append('1');
                    break;
                case "010":
                    bb.append('2');
                    break;
                case "011":
                    bb.append('3');
                    break;
                case "100":
                    bb.append('4');
                    break;
                case "101":
                    bb.append('5');
                    break;
                case "110":
                    bb.append('6');
                    break;
                case "111":
                    bb.append('7');
                    break;
                default:
                    break;
            }
        }
        return bb.toString();

    }
}

你可能感兴趣的:(蓝桥练习)