“蓝桥杯”试题集-试题 基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
***【*提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
重点:
提示中 某进制数 是十进制吗?
Java中 Integer对象中有进制转换方法
10进制转化其他进制 对应的方法,参数:n(原10进制数据),r(进制), 返回值
10进制转2进制 Integer.toBinaryString(n); 一个二进制字符串.
10进制转8进制 Integer.toOctalString(n); 一个八进制字符串
10进制转16进制 Integer.toHexString(n); 一个16进制字符串
10进制转 r 进制 Integer.toString(100, 16); 一个r进制字符串
r进制转10进制 Integer.valueOf(s, radix)
r进制转10进制 Integer.parseInt(String s ,int radix)
两者区别 Integer.valueOf()返回值为Integer类型,parseInt返回的是int类型
限制:radix取值范围为2 - 36,s限制长度为7
两者详细区别请:https://blog.youkuaiyun.com/jerry_player/article/details/105556090
由于Integer.valueOf(s, radix) (或 Integer.parseInt(String s ,int radix))在进制转化时的天然缺陷 在本题 每个十六进制数长度不超过100000 的条件下是不可用的。
根据本人经验,这里 某进制应该为二进制,所以可能是先将十六进制串转化为二进制串,再根据某种特性转化为八进制串。
以36(16)为例说明转化思路:
十六进制换成二进制数
3(16) = 0011(2)
6(16) = 0110(2)
36(16) = 0011 0110(2)
二进制转 八进制 (从后往前看)
110(2) = 6 (8)
110 (2) = 6 (8)
000(2) = 0 (8) 这里在最前面补0
0011 0110(2) = 66(8) 这里去除高位的0
代码实现:
package jinzhizhuanghua;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Integer n = sc.nextInt();
String arr[] = new String[n]; //存储输入的数 / 中间 保存 二进制串
List<String> hexList = new ArrayList<String>(); // 0-15 的 十六进制表示
List<String> binList = new ArrayList<String>(); // 0-15 的 二进制表示
String result[] = new String[n]; // 八进制结果
StringBuilder sBuilder = new StringBuilder(); // 保存二进制串 转为 八进制串
for (int i = 0; i < 16; i++) {
String binString = Integer.toBinaryString(i);
if (binString.length() < 2 ) {
binString = "000" + binString;
}
else if (binString.length() < 3 ) {
binString = "00" + binString;
}
else if (binString.length() < 4) {
binString = "0" + binString;
}
String hexString = Integer.toHexString(i).toUpperCase();
hexList.add(hexString);
binList.add(binString);
}
for( int i = 0 ; i < n; i++)
{
arr[i] = sc.next();
}
//把所有 十六进制转化为 二进制数
for (int i =0;i < n ; i++) {
for (int j = 0; j < binList.size(); j++) {
arr[i] = arr[i].replace(hexList.get(j), binList.get(j));
}
}
for (int j = 0 ; j < n ; j++) {
for(int i = arr[j].length(); i >0 ;i = i - 3)
{
String temp = null;
if (i - 3 >= 0 ) {
temp = arr[j].substring(i - 3, i);
}
else {
temp = arr[j].substring(0, i);
}
//二进制转十进制
Integer tempInteger = Integer.parseInt(temp, 2);
temp = Integer.toOctalString(tempInteger);
if (i - 3 > 0 || !"0".equals(temp)) {
sBuilder.append(temp);
}
}
result[j] = sBuilder.reverse().toString();
sBuilder.delete(0, sBuilder.length());
}
for (String string : result) {
System.out.println(string);
}
}
}
思路二:(做成的小伙伴可以交流一下)
利用 BigInteger 实现进制转换。
利用BigInteger 实现进制转换比较简单,注释很详细。
import java.math.BigInteger;
/*
* BigIntegerArbitraryConversion
*/
public class BigIntegerArbitraryConversion {
public static void main(String[] args) {
System.out.println(change("1410", 8, 2)); // 八进制转二进制
System.out.println(change("1410", 8, 10)); // 八进制转十进制
System.out.println(change("1410", 8, 16)); // 八进制转十六进制
}
/**
* number 要转换的数
* from 原数的进制
* to 要转换成的进制
*/
private static String change(String number, int from, int to) {
return new BigInteger(number, from).toString(to);
}
}
参考博客:
https://blog.youkuaiyun.com/qq_40358862/article/details/88934619
https://blog.youkuaiyun.com/jerry_player/article/details/105556090