当前位置 : 主页 > 编程语言 > java >

【蓝桥杯】基础练习 十六进制转八进制(Java实现)

来源:互联网 收集:自由互联 发布时间:2022-07-17
试题 基础练习 十六进制转八进制 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1


试题 基础练习 十六进制转八进制

资源限制
时间限制:1.0s 内存限制:512.0MB


问题描述   给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、 大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

分析

题中说了“每个十六进制数长度不超过100000”,这个长度哪怕是long类型也容纳不下,所以不能先转换成10进制,再转换成8进制。
具体16 -》2-》8

Java代码实现

package cn.com.codingce.lq.base;

import java.util.Scanner;

public class HexadecimalToOctal {
// 定义常量字符串
static String[] bin = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
"1011", "1100", "1101", "1110", "1111"};

static String[] otc = {"0", "1", "2", "3", "4", "5", "6", "7"};

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // n个十六进制正整数
String[] str = new String[n]; // 接收十六进制正整数的数组

// 接收十六进制正整数
for (int i = 0; i < n; i++) {
str[i] = sc.next();
}

for (int i = 0; i < n; i++) {
String result = hexToBin(str[i]).toString();
String octResult = binToOct(result.toString());
if (octResult.startsWith("0")) {
octResult = octResult.substring(1);
// substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。
// 该子字符串从指定索引处的字符开始,直到此字符串末尾。
}
System.out.println(octResult);
}

}

// 十六进制转换成二进制
@SuppressWarnings("unused")
private static StringBuffer hexToBin(String str) {
int length = str.length();
int start = 0;
int end = 1;
StringBuffer result = new StringBuffer();
for (int i = 0; i < length; i++) {
/*
* substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。 该子字符串从指定的
* beginIndex 处开始,直到索引 endIndex - 1 处的字符。 因此,该子字符串的长度为 endIndex-beginIndex。
*/
String subStr = str.substring(start, end); // 抽取一个十六进制字符
start++;
end++;
String s = transform(subStr); // 将抽取的十六进制字符转换成二进制字符
result.append(s);
}
return result;
}

// 二进制转换成八进制
@SuppressWarnings("unused")
private static String binToOct(String str) {
int length = str.length();
/*
* 二进制字符串的长度不是3的整数倍的时候,就要在字符串的前面补上相应个数的 ‘0’ 来让二进制字符串的长度变成3的整数倍
*/
if (length % 3 == 1) {
str = "00" + str;
} else if (length % 3 == 2) {
str = "0" + str;
}

int start = 0;
int end = 3;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length() / 3; i++) {
String subStr = str.substring(start, end); // 抽取三个二进制字符
start += 3;
end += 3;
String s = transform2(subStr); // 将抽取的二进制字符串转换成八进制字符
sb.append(s);
}
return sb.toString();
}

/**
* 将抽取的十六进制字符转换成二进制字符
*
* @param str
* @return
*/
@SuppressWarnings("unused")
private static String transform(String str) {
String result = "";
switch (str) {
case "0":
result = bin[0];
break;
case "1":
result = bin[1];
break;
case "2":
result = bin[2];
break;
case "3":
result = bin[3];
break;
case "4":
result = bin[4];
break;
case "5":
result = bin[5];
break;
case "6":
result = bin[6];
break;
case "7":
result = bin[7];
break;
case "8":
result = bin[8];
break;
case "9":
result = bin[9];
break;
case "A":
result = bin[10];
break;
case "B":
result = bin[11];
break;
case "C":
result = bin[12];
break;
case "D":
result = bin[13];
break;
case "E":
result = bin[14];
break;
case "F":
result = bin[15];
break;
default:
break;
}
return result;
}

/**
* 将抽取的二进制字符串转换成八进制字符
*
* @param str
* @return
*/
@SuppressWarnings("unused")
private static String transform2(String str) {
String result = "";
switch (str) {
case "000":
result = otc[0];
break;
case "001":
result = otc[1];
break;
case "010":
result = otc[2];
break;
case "011":
result = otc[3];
break;
case "100":
result = otc[4];
break;
case "101":
result = otc[5];
break;
case "110":
result = otc[6];
break;
case "111":
result = otc[7];
break;

default:
break;
}

return result;
}
}


上一篇:Java 数组
下一篇:没有了
网友评论