package jiChu;
/**
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
*/
import java.util.Scanner;
public class SixteenToEight {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
String [] result=new String[11]; //保存最后输出的结果
for(int i=0;i<n;i++){
//十六进制转换为二进制
String h=input.next(); //输入每一个十六进制数
StringBuilder tempB=new StringBuilder(); //存储二进制
for(int j=0;j<h.length();j++){
char numH=h.charAt(j); //截取每一位字符
String b=Integer.toBinaryString(Integer.valueOf(String.valueOf(numH), 16)); //String.valueOf(char)是将char类型转换为String型,Integer.valueOf(string,int)是将string类型数据按照int进制解析成十进制,Integer.toBinaryString(int)是将int型转换成二进制
for(int k=b.length();k<4;k++){ //将转换来的二进制数进行填空前置0(如3转换为11要填充为0011)
b='0'+b;
}
tempB.append(b); //将每一个字符转换的二进制四位四位合并
}
//二进制转化为八进制
StringBuilder tempO=new StringBuilder(); //存储八进制
int addZero=3-tempB.length()%3; //长度变为3的倍数,需要补的前导0的个数
for(int j=0;j<addZero;j++){
tempB=new StringBuilder("0").append(tempB); //在前边追加0
}
for(int j=0;j<tempB.length();j+=3){
String numB=tempB.substring(j, j+3); //将二进制数据按照三位一组取出
String o=Integer.toOctalString(Integer.valueOf(numB, 2)); //将string类型数据按2进制解析成十进制,Integer.toOctalString(Integer)再将十进制转换为八进制
tempO.append(o); //八进制数据,追加
}
result[i]=tempO.toString().replaceAll("^(0+)", "");//用正则表达式去掉前导零
}
input.close();
for(int i=0;i<n;i++){
System.out.println(result[i]);
}
}
}
觉得这个题真的不简单,起码对我这等渣渣来说,又是参考的网上的代码,好在每一句都研究懂了
1.该题的思想是十六进制-(十进制)->二进制->(十进制)->八进制,也就是说,主要是通过二进制转换,但是十进制起到了过渡作用,并没有实际操作
2.几个重要的方法:(小写代表该类型数据变量,大写代表该类)
(1)String.valueOf(char)是将char类型转换为String型;
(2)Integer.valueOf(string,int)是将string类型数据按照int进制解析成十进制;
(3)Integer.toBinaryString(int)是将int型转换成二进制;
(4)Integer.toOctalString(integer)再将十进制转换为八进制;
(5)string.toString().replaceAll("^(0+)", "");可以去掉字符串前边的0
3.当字符串类型需要经常更改时,使用StringBuilder比较方便;
一开始时使用了Java自带的禁止转换方法,直接十六进制->十进制->八进制,但是提交出错,是超出最大值,所以当数据属于long范围内时,使用自带的方法也可
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
String[] sixteen=new String[n];
long[] ten=new long[n];
String[] eight=new String[n];
for(int i=0;i<n;i++)
sixteen[i]=input.next();
input.close();
for(int i=0;i<n;i++) {
ten[i]=Long.parseLong(sixteen[i],16); //十六进制转换为十进制
eight[i]=Long.toString(ten[i],8); //十进制转换为八进制
System.out.println(eight[i]);
}
}
1.Integer.parseInt(string,int)或者Long.parseLong(string,int) 都是将string数据按照int进制标准转换为十进制
2.Integer.toString(int,int)或者Long.toString(long,int)都是将int或者long类型按照int(第二个参数)进制标准转换成字符串