问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
拿到题目觉着还挺简单,直接用了String和Integer的几个函数,样例输出没问题。提交上去发现提示运行错误。
下载下来测试数据,才知道输入进去了一个多么变态的数:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 int n=in.nextInt(); 9 String [] result=new String[11]; 10 for(int i=0;i<n;i++){ 11 String h=in.next(); 12 String b=Integer.toBinaryString(Integer.valueOf(h, 16)); 13 String o=Integer.toOctalString(Integer.valueOf(b, 2)); 14 result[i]=o; 15 } 16 for(int i=0;i<n;i++){ 17 System.out.println(result[i]); 18 } 19 } 20 } 21
测试数据:
在第一次的代码上做了改动:
①首先将每一位十六进制数转换为四位二进制数(一定要转为4位,使用前导0),保存为字符串;
②将字符串长度化为3的倍数,以便向八进制转化;
③每三位转化为八进制,去掉前导零;
代码如下,可通过测试:
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Poj { 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 int n=in.nextInt(); 9 String [] result=new String[11];//保存最后输出的结果 10 /*十六进制转化为二进制*/ 11 for(int i=0;i<n;i++){ 12 String h=in.next(); 13 StringBuilder tempB=new StringBuilder(); 14 for(int m=0;m<h.length();m++){ 15 char numH=h.charAt(m); 16 String b=Integer.toBinaryString(Integer.valueOf(String.valueOf(numH), 16)); 17 18 for(int k=b.length();k<4;k++){ 19 b='0'+b; 20 } 21 22 tempB.append(b); 23 } 24 25 /*二进制转化为八进制*/ 26 StringBuilder tempO=new StringBuilder();//长度变为3的倍数,需要补的前导0的个数 27 int addZero=3-tempB.length()%3; 28 for(int p=0;p<addZero;p++){ 29 tempB=new StringBuilder("0").append(tempB); 30 } 31 for(int m=0;m<tempB.length();m+=3){ 32 //把字符串长度转换为三的倍数添加前导0 33 String numB=tempB.substring(m, m+3); 34 String o=Integer.toOctalString(Integer.valueOf(String.valueOf(numB), 2)); 35 tempO.append(o); 36 } 37 result[i]=tempO.toString().replaceAll("^(0+)", "");//用正则表达式去掉前导零 38 } 39 for(int i=0;i<n;i++){ 40 System.out.println(result[i]); 41 } 42 } 43 }