基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。
样例输入
239123ABC
样例输出
714435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
题解:
先把十六进制转成二进制,每位十六进制正好转成4位二进制,然后再将二进制转成八进制,每三个二进制转成一个八进制。
注意:
在将16进制转成2进制时,要使用StringBuilder,否则会超时因为String每次修改字符串都是新建,然后删除旧的串会很影响效率,而StringBuilder是在字符串的末尾操作。
代码:
import java.util.Scanner;
/*
*通过该类对象调用ChangToBit(char c)方法可返回2进制表示的字符串
*/
class Hexadecimal{
String[] hex={
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"
};
public String ChangeToBit(char c){
if(c>='0'&&c<='9'){
return hex[c-'0'];
}
else return hex[c-'A'+10];
}
}
/*
* 通过调用该类对象的changeToOex(String astring)方法可返回该3位2进制串的8进制数值
*/
class Oex{
String[] oex={
"000","001","010","011","100","101","110","111"
};
public int changeToOex(String astring){
for(int i=0;i<8;i++){
if(oex[i].equals(astring)==true){
return i;
}
}
return 0;
}
}
public class Main {
/**
* @param args
*/
static Hexadecimal hex=new Hexadecimal();
static Oex oex=new Oex();
//将aString的位数在字符串开头补全为3的倍数,返回补全后的字符串
public static String BuQuanSanWei(String aString){
String ret="";
if(aString.length()%3==0) return aString;
if((aString.length()+1)%3==0){
ret+="0";
ret+=aString;
return ret;
}
ret+="00";
ret+=aString;
return ret;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int N=scan.nextInt();
while(N--!=0){
String aString=scan.next();
//必须用StringBuilder建立2进制字符串,否则由于需建立的字符太长会超时
StringBuilder bitStringbuilder=new StringBuilder();
for(int i=0;i
bitStringbuilder.append(hex.ChangeToBit(aString.charAt(i)));
}
//补全位数为3的倍数
String bitString=BuQuanSanWei(bitStringbuilder.toString());
//标记是否有输出
int hasOut=0;
for(int i=0;i
String nowCun="";
nowCun+=bitString.charAt(i);
nowCun+=bitString.charAt(i+1);
nowCun+=bitString.charAt(i+2);
int Num=oex.changeToOex(nowCun);
if(i==0&&Num==0) continue;
hasOut=1;
System.out.print(Num);
}
if(hasOut==0) System.out.print("0");
System.out.println();
}
}
}