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

/*
基础练习 十六进制转八进制  

问题描述
  给定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 main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        String a[] = new String[n];
        for (int i = 0; i < n; i++) {
            a[i] = input.next();
        }
        input.close();
        for (int i = 0; i < a.length; i++) {
            String s = a[i];
            String ss = toHex(s);
            if (ss.length() % 3 == 1) {
                ss = "00" + ss;
            }
            if (ss.length() % 3 == 2) {
                ss = "0" + ss;
            }
            System.out.println(toOct(ss));
        }
    }

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

    public static String toOct(String str) {
        StringBuffer octstr = new StringBuffer();
        int len = str.length();
        int m = len % 3;
        int k = 0;
        if (str.substring(0, 3).equals("000")) {
            k = 3;
        }
        for (int i = k; i < str.length() - 2; i += 3) {

            String s = str.substring(i, i + 3);
            switch (s) {
            case "000":
                octstr.append("0");
                break;
            case "001":
                octstr.append("1");
                break;
            case "010":
                octstr.append("2");
                break;
            case "011":
                octstr.append("3");
                break;
            case "100":
                octstr.append("4");
                break;
            case "101":
                octstr.append("5");
                break;
            case "110":
                octstr.append("6");
                break;
            case "111":
                octstr.append("7");
                break;
            default:
                break;
            }
        }
        return octstr.toString();
    }
}
原文地址:https://www.cnblogs.com/Alpharun/p/8623036.html