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

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

资源限制 时间限制: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实现

相关文章:

你感兴趣的文章:

标签云: