问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这道题的限制比较多,因为最开始说的是十六进制数的长度不超过100000,
而long类型才十九位,肯定不能用系统自带的进制转换方法,需要自己写
一、代码
import java.util.Scanner;
public class _12_16into8 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int number=sc.nextInt();
String[] input = new String[number];
for(int i=0;i<number;i++){
input[i]=sc.next();
}
//遍历输入的每一个数
for(int i=0;i<number;i++){
//设temp_size为第i个数的长度
int temp_size=input[i].length();
StringBuilder temp_builder=new StringBuilder();
//将第i个数转的16进制转变为2进制
for(int j=0;j<temp_size;j++){
switch(input[i].charAt(j)){
case '0':temp_builder.append("0000");break;
case '1':temp_builder.append("0001");break;
case '2':temp_builder.append("0010");break;
case '3':temp_builder.append("0011");break;
case '4':temp_builder.append("0100");break;
case '5':temp_builder.append("0101");break;
case '6':temp_builder.append("0110");break;
case '7':temp_builder.append("0111");break;
case '8':temp_builder.append("1000");break;
case '9':temp_builder.append("1001");break;
case 'A':temp_builder.append("1010");break;
case 'B':temp_builder.append("1011");break;
case 'C':temp_builder.append("1100");break;
case 'D':temp_builder.append("1101");break;
case 'E':temp_builder.append("1110");break;
case 'F':temp_builder.append("1111");break;
}
}
StringBuilder eight_builder=new StringBuilder();
temp_builder=temp_builder.reverse();
//将第i个数转的二进制数转变为八进制
for(int count=0;count<temp_builder.length();count=count+3){
String temp=new String();
StringBuilder tem=new StringBuilder();
int stemp=0;
if(count+3<temp_builder.length()){
//String反转,用StringBuilder做中介
temp=temp_builder.substring(count, count+3);
tem=new StringBuilder(temp);
tem=tem.reverse();
temp=tem+"";
}else{
temp=temp_builder.substring(count, temp_builder.length());
//substring的用法
/* String str = "Hello Java World!";
Method1: substring(int beginIndex)
返回从起始位置(beginIndex)至字符串末尾的字符串
str.substring(2);
//return "llo Java World!";
Method2: substring(int beginIndex, int endIndex)
返回从起始位置(beginIndex)到目标位置(endIndex)之间的字符串,但不包含目标位置(endIndex)的字符
str.substring(2,4);
//return "ll";
*/
tem=new StringBuilder(temp);
tem=tem.reverse();
temp=tem+"";
int key=0;
for(int p=0;p<temp.length();p++){
if(temp.charAt(p)=='1'){
key=1;
}
}
if(key==0){
break;
}
}
for(int k=0;k<temp.length();k++){
switch( temp.charAt(k) ){
case '1':stemp+=Math.pow(2, temp.length()-1-k);break;
case '0':break;
}
}
eight_builder=eight_builder.append(stemp);
}
System.out.println(eight_builder.reverse());
}
}
}
二、总结:
1.Integer.parseInt(String s, int radix) : 将s当作radix进制返回s的十进制, Long.parseLong(String s, int radix) : 将s当作radix进制返回s的十进制
但是Float.parseFloat只能将数字转化为float型,而不能进行进制之间的转换
2.substring(beginIndex,endIndex) //[beginIndex,endIndex)
3.String反转,用StringBuilder做中介
temp=temp_builder.substring(count, count+3);
tem=new StringBuilder(temp);
tem=tem.reverse();
temp=tem+"";
4.为什么Long.parseLong最多只能转换19位数字,Long最大不是64位么?
long类型的最大值是9223372036854775807,刚好长度是19个数字。你说的64位 应该说的是2的64次方。
5.
三、参考:
1.java基本数据类型的范围
2.Java parseInt()和parseFloat()的用法
3.进制转换-Java中自带方法解析