前言
进制转化包括这篇我写了三篇了,这篇没讲的好多要点都在其他两篇讲到了大家有需要请点击下面链接跳转去学习
有点累了,害,Keep Walking
蓝桥杯试题 基础练习 BASIC-11十六进制转十进制——冲刺蓝桥杯第六天
蓝桥杯试题 基础练习 BASIC-10十进制转十六进制——冲刺蓝桥杯第五天
要点
- 仍然是数据范围
输入的16进制位数这么多,那肯定转化后的10进制数也很大啊,而且长度为100000的16进制数转化后的10进制数即使是long
也放不下啊
但是我们可以用String
型,因为它容纳足够多的字符,我们将16进制字符串,转化为2进制字符串,再转化为8进制字符串
16进制可以转化为4位2进制数,3位2进制数可以转化为1位8进制数 - 一定要注意题目给你的暗示
我们将16进制字符串,转化为2进制字符串,再转化为8进制字符串
思路一:简单方法——调用java自带的方法,发生了错误,这个方法本质上是16进制先转化为10进制,10进制再转化为8进制,但是因为输入的16进制的位数很多,导致转化后得到的10进制数很大,大到连long
也放不下
Integer.toOctalString(Integer.valueOf(array[i], 16))
Integer.valueOf(array[i], 16)
Integer.valueOf(String s,in radix) (return)Integer
该方法用来讲某字符串按某进制转化为Integer
型,第一个参数为需要转化的字符串,第二个参数是转化采取的进制,返回类型为IntegerInteger.toOctalString(int i) (return)String
该方法将某int
型整数转化为8进制
字符串
本题代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] array = new String[n];
for (int i = 0; i < n; i++) {
array[i] = scanner.next();
}
for (int i = 0; i < n; i++) {
System.out.println(Integer.toOctalString(Integer.valueOf(array[i], 16)));
}
//我怀疑是这一步将字符串转化为Integer,而Integer放不下导致数据缺失
// Integer.valueOf(array[i], 16)
}
}
思路二:16进制先转化为2进制,2进制再转化为8进制
- 注意8进制是三个2进制数一组,所以对长度除以3取余数,不是3的整数倍的在前面补零
//敲黑板。。。注意8进制是三个2进制数一组,所以对长度除以3取余数,不是3的整数倍的在前面补零
if (strBinary.length() % 3 == 1) strBinary = "00" + strBinary;
if (strBinary.length() % 3 == 2) strBinary = "0" + strBinary;
- 输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
if (strBinary.substring(0, 3).equals("000")) {
//看看前三位是不是0,是零就从第四位开始截取,因为题目说输入的十六进制数不会有前导0,比如012A。
//所以最差的情况是输入的16进制数为"1",转化为2进制后为"0001",位数不是3的倍数,加0变为"000001"
//这种情况如果不处理,转化为8进制数就会变成"01"
//而题目要求输出的八进制数也不能有前导0。
//"000001"为最差情况,所以能处理它,别的就都能
k = 3;
} else {
k = 0;
}
for (int i = k; i < strBinary.length() - 2; i += 3) {
//省略}
本题代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] a = new String[n];
for (int i = 0; i < n; i++) {
a[i] = sc.next();//接受用户输入
}
sc.close();
for (int i = 0; i < n; i++) {
String strBinary = hexToBinary(a[i]);//16进制转化为2进制
//敲黑板。。。注意8进制是三个2进制数一组,所以对长度除以3取余数,不是3的整数倍的在前面补零
if (strBinary.length() % 3 == 1) strBinary = "00" + strBinary;
if (strBinary.length() % 3 == 2) strBinary = "0" + strBinary;
String strOctal = binaryToOctal(strBinary); //2进制转化为8进制
System.out.println(strOctal);
}
}
//十六进制转二进制算法
private static String hexToBinary(String strHex) {
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < strHex.length(); i++) {
switch (strHex.charAt(i)) {//截取16进制数的每一个字符,并将其转换为对应2进制数
case '0':
sBuffer.append("0000");
break;
case '1':
sBuffer.append("0001");
break;
case '2':
sBuffer.append("0010");
break;
case '3':
sBuffer.append("0011");
break;
case '4':
sBuffer.append("0100");
break;
case '5':
sBuffer.append("0101");
break;
case '6':
sBuffer.append("0110");
break;
case '7':
sBuffer.append("0111");
break;
case '8':
sBuffer.append("1000");
break;
case '9':
sBuffer.append("1001");
break;
case 'A':
sBuffer.append("1010");
break;
case 'B':
sBuffer.append("1011");
break;
case 'C':
sBuffer.append("1100");
break;
case 'D':
sBuffer.append("1101");
break;
case 'E':
sBuffer.append("1110");
break;
case 'F':
sBuffer.append("1111");
}
}
return sBuffer.toString();
}
//二进制转换为八进制算法
private static String binaryToOctal(String strBinary) {
int k;
StringBuilder sBuffer = new StringBuilder();
if (strBinary.substring(0, 3).equals("000")) {
//看看前三位是不是0,是零就从第四位开始截取,因为题目说输入的十六进制数不会有前导0,比如012A。
//所以最差的情况是输入的16进制数为"1",转化为2进制后为"0001",位数不是3的倍数,加0变为"000001"
//这种情况如果不处理,转化为8进制数就会变成"01"
//而题目要求输出的八进制数也不能有前导0。
//"000001"为最差情况,所以能处理它,别的就都能
k = 3;
} else {
k = 0;
}
for (int i = k; i < strBinary.length() - 2; i += 3) {
switch (strBinary.substring(i, i + 3)) {
case "000":
sBuffer.append("0");
break;
case "001":
sBuffer.append("1");
break;
case "010":
sBuffer.append("2");
break;
case "011":
sBuffer.append("3");
break;
case "100":
sBuffer.append("4");
break;
case "101":
sBuffer.append("5");
break;
case "110":
sBuffer.append("6");
break;
case "111":
sBuffer.append("7");
}
}
return sBuffer.toString();
}
}
转载:https://blog.csdn.net/weixin_43124279/article/details/104949582
查看评论