题目:基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
答案:
import java.util.Scanner;
public class Main
{
public static void toBinaryTransform(int n, char[][] arry, String[] arryBinaryStr)
{//(个数,二进制数,放对应的二进制)
String[] arryOctalStr = new String[10];
String str = "";
StringBuilder octalStb = new StringBuilder();
StringBuilder binaryStb = new StringBuilder();
/*
* String[] arryOctalBinaryStr = { "000", "001", "010", "011", "100", "101",
* "110", "111" };
*/
int i, j, k, len;
for (i = 0; i < n; i++)
{
arryBinaryStr[i] = "";
arryOctalStr[i] = "";
len = arry[i].length;//当前十六进制数的一维字符数组的长度
//将当前十六进制数转为二进制,放入StringBuilder 的 binaryStb中
for (j = 0; j < len; j++)
{ // Convert Hex into Binary 从头开始进行转化
switch (arry[i][j])
{
case '0':
binaryStb.append("0000");
break;
case '1':
binaryStb.append("0001");
break;
case '2':
binaryStb.append("0010");
break;
case '3':
binaryStb.append("0011");
break;
case '4':
binaryStb.append("0100");
break;
case '5':
binaryStb.append("0101");
break;
case '6':
binaryStb.append("0110");
break;
case '7':
binaryStb.append("0111");
break;
case '8':
binaryStb.append("1000");
break;
case '9':
binaryStb.append("1001");
break;
case 'A':
binaryStb.append("1010");
break;
case 'B':
binaryStb.append("1011");
break;
case 'C':
binaryStb.append("1100");
break;
case 'D':
binaryStb.append("1101");
break;
case 'E':
binaryStb.append("1110");
break;
case 'F':
binaryStb.append("1111");
break;
default:
break;
}
}
// 将当前十六进制的二进制的String放入管理所有的二进制的arryBinaryStr String数组中
arryBinaryStr[i] = binaryStb.toString();
// 清空刚刚临时存放二进制的 binaryStb
binaryStb = new StringBuilder();
// 对刚刚放入管理所有二进制的数组的二进制进行位数上的处理,调整位数,长度不能整除3,则在前头补0
if (arryBinaryStr[i].length() % 3 == 1)
{ // Correct the Binary in order to convert it into Octal.
arryBinaryStr[i] = "00" + arryBinaryStr[i];
}
else if (arryBinaryStr[i].length() % 3 == 2)
{
arryBinaryStr[i] = "0" + arryBinaryStr[i];
}
// 获得当前十六进制的二进制的处理好的位数
len = arryBinaryStr[i].length() / 3;
// 取得当前十六进制的八进制的位数,开始进行二进制转八进制
for (j = 0; j < len; j++)
{ // Convert Binary into Octal
// 三位数三位数地转换,从头开始进行转化
str = arryBinaryStr[i].substring(j * 3, j * 3 + 3);
/*
* for (k = 0; k <= 7; k++) { if (str.equals(arryOctalBinaryStr[k])) {
* octalStb.append(k); } }
*/
switch (str)
{
case "000":
octalStb.append("0");
break;
case "001":
octalStb.append("1");
break;
case "010":
octalStb.append("2");
break;
case "011":
octalStb.append("3");
break;
case "100":
octalStb.append("4");
break;
case "101":
octalStb.append("5");
break;
case "110":
octalStb.append("6");
break;
case "111":
octalStb.append("7");
break;
}
}
// 把临时结果octalStb的toString放进管理所有的八进制的arryOctalStr数组中
arryOctalStr[i] = octalStb.toString();
// 清空临时区域 octalStb
octalStb = new StringBuilder();
// 取当前得到的八进制数的首位,看看其是否为0,若为0,则不打印出首位,得到一个就打印一个八进制
str = arryOctalStr[i].substring(0, 1);
if (str.equals("0"))
{ // Remove the first zero and print Octal.
System.out.println(arryOctalStr[i].substring(1, arryOctalStr[i].length()));
}
else
{
System.out.println(arryOctalStr[i]);
}
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//读取行数
char[][] arry = new char[10][100000];
String[] arryBinaryStr = new String[10];
String number;//存放十六进制的数的字符串
if (n >= 1 && n <= 10)
{
for (int i = 0; i < n; i++)
{
number = sc.next();
arry[i] = number.toCharArray();//将十六进制的数的字符串转为一维字符数组,放入二维数组中
// System.out.println("````````````"+number.toCharArray()[0]);
}
toBinaryTransform(n, arry, arryBinaryStr);//将二维数组中的十六进制数转为二进制,二进制再转八进制;(个数,二进制数,放对应的二进制),从头开始转换
}
}
}
个人小结:
进制之间的转换:
https://baike.baidu.com/item/%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2/3117222?fr=aladdin