蓝桥杯试题基础练习
这道题看似很简单,用Java自带的进制转换就行,但题目中有一句话,它规定每个十六进制数长度不超过100000,这是一个非常大的数,如果是用Java自带的进制转换,提交后运行会报错。
提示也告诉我们要先将十六进制转换成某进制数再转换为八进制,而这个某进制很明显就是二进制了,所以正确解法如下:
import java.util.Scanner;
public class 十六进制转八进制 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
char[][] str = new char[n][];
for (int i = 0; i < n; i++) {
str[i] = new StringBuilder(in.next()).toString().toCharArray();
}
in.close();
for (int i = 0; i < n; i++) {
//将十六进制转化为二进制
String strBinary = toBinary(str[i]);
int len = strBinary.length();
//二进制转为八进制是以三个二进制数为一位八进制数
if (len % 3 == 1) strBinary = "00" + strBinary;
if (len % 3 == 2) strBinary = "0" + strBinary;
//将二进制转为八进制
String strOctal = toOctal(strBinary);
System.out.println(strOctal);
}
// 若十六进制数比较小,可以用Java自带的进制转换
// String []str=new String[n];
// for(int i=0;i<n;i++){
// String a = in.next();
// int b = Integer.parseInt(a,16);
// str[i] = Integer.toString(b,8);
// }
// for(String i:str){
// System.out.println(i);
// }
}
private static String toBinary(char[] str) {
StringBuffer str3 = new StringBuffer();
for (int i = 0; i < str.length; i++) {
switch (str[i]) {
case '0':
str3.append("0000");
break;
case '1':
str3.append("0001");
break;
case '2':
str3.append("0010");
break;
case '3':
str3.append("0011");
break;
case '4':
str3.append("0100");
break;
case '5':
str3.append("0101");
break;
case '6':
str3.append("0110");
break;
case '7':
str3.append("0111");
break;
case '8':
str3.append("1000");
break;
case '9':
str3.append("1001");
break;
case 'A':
str3.append("1010");
break;
case 'B':
str3.append("1011");
break;
case 'C':
str3.append("1100");
break;
case 'D':
str3.append("1101");
break;
case 'E':
str3.append("1110");
break;
case 'F':
str3.append("1111");
break;
default:
break;
}
}
return str3.toString();
}
private static String toOctal(String str) {
StringBuffer strOctal = new StringBuffer();
int k = 0;
//这一步的目的是消除转换为八进制后,第一位可能的0
if(str.substring(0, 3).equals("000"))
k=3;
for (int i = k; i < str.length()-2; i += 3) {
switch (str.substring(i, i + 3)) {
case "000":
strOctal.append("0");
break;
case "001":
strOctal.append("1");
break;
case "010":
strOctal.append("2");
break;
case "011":
strOctal.append("3");
break;
case "100":
strOctal.append("4");
break;
case "101":
strOctal.append("5");
break;
case "110":
strOctal.append("6");
break;
case "111":
strOctal.append("7");
break;
default:
break;
}
}
return strOctal.toString();
}
}
参考:https://blog.csdn.net/qq_37306670/article/details/79280283