import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); for (int j = 0; j < t; j++) { String str = sc.next(); int len = str.length(); int[] binary = new int[100000 * 4 + 10]; for (int i = 0; i < len; i++) { String string = hexadecimalToBinary(str.charAt(i)); binary[i * 4 + 0] = string.charAt(0) - ‘0‘; binary[i * 4 + 1] = string.charAt(1) - ‘0‘; binary[i * 4 + 2] = string.charAt(2) - ‘0‘; binary[i * 4 + 3] = string.charAt(3) - ‘0‘; } int llen = 4 * len; StringBuilder ans = new StringBuilder(); ans.append(""); if (llen % 3 == 0) { for (int i = 0; i < llen / 3; i++) { String string = binaryToOctonary(binary[3 * i], binary[3 * i + 1], binary[3 * i + 2]); ans.append(string); } } else if (llen % 3 == 1) { int temp = binary[0]; if (temp != 0) ans.append("1"); for (int i = 0; i < llen / 3; i++) { String string = binaryToOctonary(binary[3 * i + 1], binary[3 * i + 2], binary[3 * i + 3]); ans.append(string); } } else { int temp = binary[0] * 2 + binary[1]; if (temp != 0) ans.append(temp); for (int i = 0; i < llen / 3; i++) { String string = binaryToOctonary(binary[3 * i + 2], binary[3 * i + 3], binary[3 * i + 4]); ans.append(string); } } int l = 0; l = ans.length(); if (ans.charAt(0) == ‘0‘) { System.out.println(ans.substring(1)); } else { System.out.println(ans); } } sc.close(); } private static String binaryToOctonary(int i, int j, int k) { return (4 * i + 2 * j + 1 * k) + ""; } private static String hexadecimalToBinary(char c) { String str = null; switch (c) { case ‘0‘: str = "0000"; break; case ‘1‘: str = "0001"; break; case ‘2‘: str = "0010"; break; case ‘3‘: str = "0011"; break; case ‘4‘: str = "0100"; break; case ‘5‘: str = "0101"; break; case ‘6‘: str = "0110"; break; case ‘7‘: str = "0111"; break; case ‘8‘: str = "1000"; break; case ‘9‘: str = "1001"; break; case ‘A‘: str = "1010"; break; case ‘B‘: str = "1011"; break; case ‘C‘: str = "1100"; break; case ‘D‘: str = "1101"; break; case ‘E‘: str = "1110"; break; case ‘F‘: str = "1111"; break; } return str; } }
这题思路很清晰,就是把十六进制的数(字符串)转化为二进制,在把二进制转换为八进制。
但是感觉被坑了一下,就是在输入的是后,sc.next()和sc.nextLine---
以前在写c/c++的时候就被坑过(printf什么的),所以一开始写的sc.nextLine,导致我的substring一直报错、、、
哎、刚刚学Java,什么具体的知识点感觉都不太清楚,还要多多看书和实验
原文:http://www.cnblogs.com/huanhuan10/p/6391690.html