进制转换
十六进制转八进制
问题描述
问题描述 给定n个十六进制正整数,输出它们对应的八进制数。
输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式 输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入 2 39 123ABC
样例输出 71 4435274
【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。
大体思路
根据提示先把十六进制转换成二进制,再把二进制转换成八进制
十六进制转换二进制的方法
先来看看如何把十六进制转换成二进制
-
把字符串中的每一位拿出来
-
单独转换成二进制,不够四位补零
1 | 2 | 3 | A | B | C |
---|---|---|---|---|---|
0 0 0 1 | 0 0 1 0 | 0 0 1 1 | 1 0 1 0 | 1 0 1 1 | 1 0 1 2 |
-
组合起来就是二进制的表示
二进制转八进制的方法
-
每三个二进制数位一组
-
百位乘4 十位乘2 个位乘1 相加
-
组合相加的数就是二进制转八进制的结果
0 0 1 | 0 1 0 | 0 1 1 | 结果 |
---|---|---|---|
0乘4+0乘2+1 乘1 = 1 | 0乘4+1乘2+0乘1 =2 | 0乘4+1乘2+1乘1=3 | 123 |
代码实现
package lanqiaobie.base.jinzhi;
import java.util.Scanner;
/**
* 十六进制转八进制
*/
public class JInZhi16_8_12 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] count = new String[sc.nextInt()];
// 把用户输入保存的数组中
for (int i = 0; i < count.length; i++)
count[i] = sc.next();
// 遍历数组拿出字符串,拿出来一个转换一次
for (int i = 0; i < count.length; i++)
JInZhi16_2(count[i]);
}
/**
* 十六进制转换字符串的方法
* @param num 转换的十六进制字符串
*/
public static void JInZhi16_2(String num) {
StringBuffer result = new StringBuffer();
//遍历字符串 拿出字符串的每个字符 从后向前拿
for (int i = num.length() -1 ; i >=0; i--) {
int temp = num.charAt(i);
//把字符转换成数字 temp>=65代表是字母 大写字母A-55就是十六进制原数字 字符数字-‘0’得到十六进制原数字
temp = temp >= 65 ? temp - 55 : temp - '0';
//把数字temp%2取4次 如果temp为0刚好填充二进制
for (int j = 0; j < 4; j++) {
result.append(temp % 2);
temp /= 2;
}
}
//从后向前取
JInZhi2_8(result.reverse());
}
/**
* 二进制转八进制
* @param num
*/
public static void JInZhi2_8(StringBuffer num){
StringBuffer result = new StringBuffer();
//如果这个字符串的个数不够3的倍数就补零
while (num.length()%3!=0){
num.insert(0,'0');
}
// 0 3 6 9 12
//每次i+3 给二进制数三个一组
//i+1*4 + i + 2 * 2 + i + 3 * 1
for (int i = 0 ; i < num.length();i += 3){
int temp01 = (num.charAt(