题目:
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:
刚开始写,想都不想直接java 进制api,后面发现这种进制转换api在遇到超级长的数字时就跑不动了,因为题目说低于十万位,显然要求能处理大数字。大数字java api处理不了,可以用字符串来代替。提示也说了,先将十六进制转换为某进制,其实就是二进制数,一个十六进制数换4个二进制数,接着将得到的二进制数转成8进制,3个二进制数换1个八进制数,所以先判断二进制数长度是否为3的倍数,若刚合适,则防止数字前导是三个0,若数字前三位为0则删除;若多出一个数字则判断这个数字是否为0,是0就删除,若不是0,则额外增加2个0;若多出2个,则判断头两个是否为00,若为00,则删除,若不是则在开头加一个0;最后用Integer.parseInt(xxx,2)
方法将3个3个的二进制数换成十进制,因为换成十进制最后相接就是我们要得到的8进制数
代码:
import java.util.Scanner;
public class Main {
//用Integer类自带的二进制,八进制,十六进制
//Integer.valueOf(a, b)这个的用法和上面那个parseInt一样
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);//输入行数
int n=sc.nextInt();
String[]s=new String[11];//10行
for(int i=0;i<n;i++) {//输入每行字符串
String ss=sc.next();
s[i]=ss;
}
for(int j=0;j<n;j++) {//
StringBuilder two=new StringBuilder();//2进制
for(int k=0;k<s[j].length();k++) {
char num=s[j].charAt(k);
switch(num) {
case '0':two.append("0000");break;
case '1':two.append("0001");break;
case '2':two.append("0010");break;
case '3':two.append("0011");break;
case '4':two.append("0100");break;
case '5':two.append("0101");break;
case '6':two.append("0110");break;
case '7':two.append("0111");break;
case '8':two.append("1000");break;
case '9':two.append("1001");break;
case 'A':two.append("1010");break;
case 'B':two.append("1011");break;
case 'C':two.append("1100");break;
case 'D':two.append("1101");break;
case 'E':two.append("1110");break;
case 'F':two.append("1111");break;
}
}
eight(two);
}
}
public static void eight(StringBuilder two) {
StringBuilder eight=new StringBuilder();//2进制
int twolen=two.length();
if(twolen%3==0) {//刚好够分配,则判断最前面有无000
if(two.substring(0, 3).equals("000")) {
two.delete(0, 3);
}
}
else if(twolen%3==1) {//多出一个
if(two.substring(0, 1).equals("0")) {
two.delete(0, 1);
}
else {
two=two.insert(0, "00");
}
}
else if(twolen%3==2) {//多出两个
if(two.substring(0, 2).equals("00")) {
two.delete(0, 2);
}
else {
two=two.insert(0, "0");
}
}
int two_newlen=two.length();
for(int i=0;i<two_newlen/3;i++) {
int N=Integer.parseInt(two.substring(i*3,i*3+3),2);//2进制转化成10进制
eight.append(N);
}
System.out.println(eight);
}
}