問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成二進制數,再由二進制數轉換成八進制。
難點就是數值太大了,10w個F啊, 思路就是換成二進制再換成八進制,用java大數類一直超時,所以不能用大數方法
### 先來超時的方法
~~~
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
String temp = input.next();
BigInteger num = new BigInteger(temp,16);
arr[i] = num.toString(8).toUpperCase();
}
for (String string : arr) {
System.out.println(string);
}
}
}
~~~
### 下面是正確的方法
~~~
package com.day7;
import java.util.Scanner;
public class Main {
//定義16進制需要的二進制碼
static String[] hex = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[] arrs = new String[n];
for (int i = 0; i < n; i++) {
arrs[i] = input.next();
}
for (int i = 0; i < arrs.length; i++) {
translateToOct(translateToBin(arrs[i]));
}
}
//把得到的二進制串轉換成八進制
private static void translateToOct(StringBuilder builder){
StringBuilder builder2 = new StringBuilder();
for (int i = 0; i < builder.length()-1; i = i+3) {
switch (builder.substring(i, i+3)) {
case "000":
builder2.append("0");
break;
case "001":
builder2.append("1");
break;
case "010":
builder2.append("2");
break;
case "011":
builder2.append("3");
break;
case "100":
builder2.append("4");
break;
case "101":
builder2.append("5");
break;
case "110":
builder2.append("6");
break;
case "111":
builder2.append("7");
break;
}
}
if (builder2.charAt(0) == '0') {
builder2.deleteCharAt(0);
}
System.out.println(builder2.toString());
}
//把輸入的字符串變成二進制串
private static StringBuilder translateToBin(String str){
StringBuilder builder = new StringBuilder();
//轉換后補0湊成3的倍數
if ((str.length()*4)%3 != 0) {
if ((str.length()*4)%3 == 1) {
builder.append("00");
}else {
builder.append("0");
}
}
//接下來開始轉換
for (int i = 0; i < str.length(); i++) {
switch (str.charAt(i)) {
case '0':
builder.append(hex[0]);
break;
case '1':
builder.append(hex[1]);
break;
case '2':
builder.append(hex[2]);
break;
case '3':
builder.append(hex[3]);
break;
case '4':
builder.append(hex[4]);
break;
case '5':
builder.append(hex[5]);
break;
case '6':
builder.append(hex[6]);
break;
case '7':
builder.append(hex[7]);
break;
case '8':
builder.append(hex[8]);
break;
case '9':
builder.append(hex[9]);
break;
case 'A':
builder.append(hex[10]);
break;
case 'B':
builder.append(hex[11]);
break;
case 'C':
builder.append(hex[12]);
break;
case 'D':
builder.append(hex[13]);
break;
case 'E':
builder.append(hex[14]);
break;
case 'F':
builder.append(hex[15]);
break;
}
}
return builder;
}
}
~~~