蓝桥杯java:基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解:
以十进制作为中间桥梁行不通,题目要求每个十六进制数长度不超过100000,转成十进制存不下来。
因此考虑转为二进制,再转成八进制。
public class test {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String arr[] = new String[n];
for(int i = 0;i < n;i++) {
arr[i] = input.next();
}
input.close();//防止资源泄露
for(int i = 0;i < arr.length;i++) {
String s = HextoOct(arr[i]);
System.out.println(s.replaceFirst("0", ""));//使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
}
}
private static String HextoOct(String s) {
StringBuffer s1=new StringBuffer("");
//十六进制转二进制
for(int i=0;i<s.length();i++) {
switch(s.charAt(i)) {//charAt(int index)用来检索特定索引下的字符的String实例.
case '0':s1.append("0000");break;
case '1':s1.append("0001");break;
case '2':s1.append("0010");break;
case '3':s1.append("0011");break;
case '4':s1.append("0100");break;
case '5':s1.append("0101");break;
case '6':s1.append("0110");break;
case '7':s1.append("0111");break;
case '8':s1.append("1000");break;
case '9':s1.append("1001");break;
case 'A':s1.append("1010");break;
case 'B':s1.append("1011");break;
case 'C':s1.append("1100");break;
case 'D':s1.append("1101");break;
case 'E':s1.append("1110");break;
case 'F':s1.append("1111");break;
}
}
s = s1.toString();
//字符的长度如果不能整除3,则需要在转换的结果前补0;
if (s.length()%3 == 1)
s = "00"+s;
else if(s.length()%3 == 2)
s = "0"+s;
StringBuffer s2 =new StringBuffer("");
//二进制转八进制
for(int i = 0;i < s1.length();i+=3) {
String str = s.substring(i, i+3);//substring(x,y)是从x到y前的位置停止
switch(str) {
case "000":s2.append('0');break;
case "001":s2.append('1');break;
case "010":s2.append('2');break;
case "011":s2.append('3');break;
case "100":s2.append('4');break;
case "101":s2.append('5');break;
case "110":s2.append('6');break;
case "111":s2.append('7');break;
}
}
return s2.toString();
}
}
charAt:是一个能够用来检索特定索引下的字符的String实例的方法.
例如:str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.
replaceFirst():使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
语法
public String replaceFirst(String regex,String replacement);
参数:
regex – 匹配此字符串的正则表达式。
replacement – 用来替换第一个匹配项的字符串。
返回值:
成功则返回替换的字符串,失败则返回原始字符串。
substring(int beginIndex, int endIndex:是从x到y前的位置停止。
1、取得的字符串长度为:endIndex - beginIndex;
2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符。
代码和思路是学习这位博主的:
https://blog.csdn.net/qq_41500251/article/details/85058159
网上看了很多版本的代码解法,感觉这个博主讲得很好,很清晰易懂。