问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示 】
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示 】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
作为算法小白,在跟学长交流后,决定尝试写写此题,进制转换问题之前只是用C语言写过,当时用二进制做中间桥梁,而字符的处理问题不需考虑,用java则有点不同,对于十六进制转十进制这种基础题,用java直接调用方法反而一两句话就可以搞定,但是在处理大数据的时候,会出现运行错误、超时。
第一眼看到此题,想到的是如下代码:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
Integer s=sc.nextInt();
String[] r=new String[s];
for(int i=0;i<s;i++)
{
Scanner ss=new Scanner(System.in);
String num=ss.nextLine();
String bs1 = Integer.toBinaryString(Integer.valueOf(num, 16));
String os1 = Integer.toOctalString((Integer.valueOf(bs1, 2)));
r[i]=os1;
}
for(int j=0;j<s;j++)
{
System.out.println(r[j]);
}
}
}
当时返回的是运行错误,下载下测试数据,哈哈,感觉很过分。
在上网参考大神的方法,以及跟学长讨论后,这道题的重点在除了要找一个中间桥梁外还需处理好字符,修改后的代码:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
Integer n=sc.nextInt();
String[] result=new String[11];//保存输出结果
//十六进制转二进制
for(int i=0;i<n;i++)
{
String s=sc.next();
StringBuilder tempB=new StringBuilder();
for(int j=0;j<s.length();j++)
{
char numH=s.charAt(j);
String b=Integer.toBinaryString(Integer.valueOf(String.valueOf(numH),16));
for(int k=b.length();k<4;k++)
{
b='0'+b;
}
tempB.append(b);
}
//二进制转为八进制
StringBuilder tempO=new StringBuilder();
int addZero=3-tempB.length()%3;//长度变为3的倍数,需要补的前导0的个数
for(int p=0;p<addZero;p++)
tempB=new StringBuilder("0").append(tempB);
for(int q=0;q<tempB.length();q+=3)
{
String numB=tempB.substring(q,q+3);//新字符串
String o=Integer.toOctalString(Integer.valueOf(String.valueOf(numB),2));
tempO.append(o);
}
result[i]=tempO.toString().replaceAll("^(0+)", "");//用正则表达式去掉前导0
}
for(int m=0;m<n;m++)
System.out.println(result[m]);
}
}