问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这道题是不能直接用java自带的库函数直接转化的,需要先将十六进制转二进制,然后二进制转八进制,刚开始我不会做,百度了代码,一看100多行,对于小白的我,肯定想放弃。然后今晚无聊,就看了看,发现,里面的实现其实不是很难理解,主要是在于stringbuffer的应用和switch的应该,这个真的不错,最后在蓝桥系统也测试成功了,我也终于克服了自己的内心的困难,接下来继续加油
package 十六进制转八进制;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inScanner = new Scanner(System.in);
int n = inScanner.nextInt();
String[] str = new String[n];
for(int i=0;i<n;i++) {
str[i] = inScanner.next();
}
inScanner.close();
for(int i =0;i<n;i++) {
String a1=HextoBinary(str[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 HextoBinary(String n) {
StringBuffer a = new StringBuffer();
for(int i =0;i<n.length();i++) {
switch(n.charAt(i)) {
case '0':
a.append("0000");break;
case '1':
a.append("0001");break;
case '2':
a.append("0010");break;
case '3':
a.append("0011");break;
case '4':
a.append("0100");break;
case '5':
a.append("0101");break;
case '6':
a.append("0110");break;
case '7':
a.append("0111");break;
case '8':
a.append("1000");break;
case '9':
a.append("1001");break;
case 'A':
a.append("1010");break;
case 'B':
a.append("1011");break;
case 'C':
a.append("1100");break;
case 'D':
a.append("1101");break;
case 'E':
a.append("1110");break;
case 'F':
a.append("1111");break;
default:break;
}
}
return a.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();
}
}