【蓝桥杯】基础练习 十六进制转八进制(Java实现)
生活随笔
收集整理的這篇文章主要介紹了
【蓝桥杯】基础练习 十六进制转八进制(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实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【蓝桥杯】基础练习 数列排序
- 下一篇: 【蓝桥杯】基础练习 十六进制转十进制