资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码实现
一开始的思路是将十六进制转为十进制,再将十进制转为八进制,但搜索资料发现会导致长度超出题目要求,故整体思路为:
(1)将十六进制转化为二进制
(2)再将二进制转化为八进制
代码段如下:
package LanQiao;
import java.util.Scanner;
public class ShiLiuZhuanBa {
char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int n = in.nextInt();
//存储十六进制数
String[] nums = new String[n];
for (int i = 0; i <n; i++) {
nums[i] = in.next();
}
//输出十六进制转化为八进制的数
for(int l=0;l<n;l++) {
String b = parseTwo(nums[l]);
String c = parseEight(b);
System.out.println(c);
}
}
//将十六进制转化为二进制
private static String parseTwo(String a) {
String result16 = "";
//转化为char数组进行case选取
char[] list = a.toCharArray();
for(int j=0;j<list.length;j++) {
switch(list[j]) {
case '0':result16+="0000";break;
case '1':result16+="0001";break;
case '2':result16+="0010";break;
case '3':result16+="0011";break;
case '4':result16+="0100";break;
case '5':result16+="0101";break;
case '6':result16+="0110";break;
case '7':result16+="0111";break;
case '8':result16+="1000";break;
case '9':result16+="1001";break;
case 'A':result16+="1010";break;
case 'B':result16+="1011";break;
case 'C':result16+="1100";break;
case 'D':result16+="1101";break;
case 'E':result16+="1110";break;
case 'F':result16+="1111";break;
default:break;
}
}
return result16;
}
private static String parseEight(String b) {
String result8 = "";
//因为二进制转八进制,是三位对应一位,如果二进制数长度不满足3的倍数,需要在首位补零
if(b.length()%3==1) {
b = "00"+b;
}else if(b.length()%3==2) {
b = "0"+b;
}
//将二进制每三位分一组
//如果首三位为0,则从下一组开始遍历
int start = 0;
int end = 3;
for(int k=0;k<b.length()/3;k++) {
String substring = b.substring(start, end);
// System.out.println(substring);
switch(substring) {
case "000":result8+="0";break;
case "001":result8+="1";break;
case "010":result8+="2";break;
case "011":result8+="3";break;
case "100":result8+="4";break;
case "101":result8+="5";break;
case "110":result8+="6";break;
case "111":result8+="7";break;
default:break;
}
start+=3;
end+=3;
}
if(result8.startsWith("0")) {
result8 = result8.substring(1);
}
return result8;
}
}
代码测试用例是通过的,但仍旧提示“运行超时”,故下载了输入数据,跑了一下,结果如下:
前几个都是对的,但运行较慢。因此采用StringBuffer替换,更高效处理字符串。终于对了!
package LanQiao;
import java.util.Scanner;
public class ShiLiuZhuanBa {
char[] ch = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int n = in.nextInt();
//存储十六进制数
String[] nums = new String[n];
for (int i = 0; i <n; i++) {
nums[i] = in.next();
}
//输出十六进制转化为八进制的数
for(int l=0;l<n;l++) {
String b = parseTwo(nums[l]);
String c = parseEight(b);
System.out.println(c);
}
}
//将十六进制转化为二进制
private static String parseTwo(String a) {
StringBuffer result16 = new StringBuffer();
//转化为char数组进行case选取
char[] list = a.toCharArray();
for(int j=0;j<list.length;j++) {
switch(list[j]) {
case '0':result16.append("0000");break;
case '1':result16.append("0001");break;
case '2':result16.append("0010");break;
case '3':result16.append("0011");break;
case '4':result16.append("0100");break;
case '5':result16.append("0101");break;
case '6':result16.append("0110");break;
case '7':result16.append("0111");break;
case '8':result16.append("1000");break;
case '9':result16.append("1001");break;
case 'A':result16.append("1010");break;
case 'B':result16.append("1011");break;
case 'C':result16.append("1100");break;
case 'D':result16.append("1101");break;
case 'E':result16.append("1110");break;
case 'F':result16.append("1111");break;
default:break;
}
}
return result16.toString();
}
private static String parseEight(String b) {
StringBuffer result8 = new StringBuffer();
//因为二进制转八进制,是三位对应一位,如果二进制数长度不满足3的倍数,需要在首位补零
if(b.length()%3==1) {
b = "00"+b;
}else if(b.length()%3==2) {
b = "0"+b;
}
//将二进制每三位分一组
//如果首三位为0,则从下一组开始遍历
int start = 0;
int end = 3;
for(int k=0;k<b.length()/3;k++) {
String substring = b.substring(start, end);
// System.out.println(substring);
switch(substring) {
case "000":result8.append("0");break;
case "001":result8.append("1");break;
case "010":result8.append("2");break;
case "011":result8.append("3");break;
case "100":result8.append("4");break;
case "101":result8.append("5");break;
case "110":result8.append("6");break;
case "111":result8.append("7");break;
default:break;
}
start+=3;
end+=3;
}
String result = result8.toString();
//如果首位为0,则去掉
if(result.startsWith("0")) {
result = result.substring(1);
}
return result;
}
}
参考: