一. 问题描述
- 给定n个十六进制正整数,输出它们对应的八进制数。
1. 输入格式
- 输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0~ 9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
2. 输出格式
- 输出n行,每行为输入对应的八进制正整数。
- 【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
3. 样例输入
2
39
123ABC
4. 样例输出
71
4435274
二. 解题思路
先转成二进制,再转成八进制。
三. 代码
import java.lang.Math;
import java.util.HashMap;
import java.util.Scanner;
/**
* @Author wangyichao
* @date 2022/11/10 12:30
* @Version 1.0
* @Description
*/
public class Main{
public static String HexToBin(String num){
StringBuffer result = new StringBuffer();
HashMap<Character,String> hashMap = new HashMap<>();
//不敢把0忘了,艹
hashMap.put('0', "0000");
hashMap.put('1', "0001");
hashMap.put('2', "0010");
hashMap.put('3', "0011");
hashMap.put('4', "0100");
hashMap.put('5', "0101");
hashMap.put('6', "0110");
hashMap.put('7', "0111");
hashMap.put('8', "1000");
hashMap.put('9', "1001");
hashMap.put('A', "1010");
hashMap.put('B', "1011");
hashMap.put('C', "1100");
hashMap.put('D', "1101");
hashMap.put('E', "1110");
hashMap.put('F', "1111");
for(int i = 0; i < num.length(); i++){
result.append(hashMap.get(num.charAt(i)));
}
return result.toString();
}
public static String BinToOct(String num){
StringBuffer result = new StringBuffer();
int temp = 0;
if(num.length() % 3 == 2)
num = "0" + num;
else if(num.length() % 3 == 1)
num = "00" + num;
for(int i = 0 ; i < num.length(); i+=3) {
temp =(int)((num.charAt(i) - 48) * Math.pow(2, 2) + (num.charAt(i + 1) - 48) * Math.pow(2, 1) + (num.charAt(i + 2) - 48) * Math.pow(2, 0));
result.append(temp);
}
return result.toString().replaceAll("^(0+)", "");
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
while(count != 0){
String n = sc.next();
String s = HexToBin(n);
// System.out.println(s);
System.out.println(BinToOct(s));
count--;
}
}
}
四. 总结
- 一开始想先转成十进制,再转回八进制,我靠,运行完,发现有的十六进制转成十进制直接超过整型的表示范围,就很离谱,换方法!
- 这道题真的折磨我好几天,一直错误,答案错误,好在有朝哥指点,我把最开始的数据忘了存了!!没错就是这一行: hashMap.put(‘0’, “0000”);,啊啊啊啊啊啊!
- 改完后,运行超时,把String改为StringBuffer,才运行正确。