十六進位制轉八進位制
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Basic12 {
//方式一 (利用十進位制轉化)
// public static void main(String [] args){
// Scanner sc = new Scanner(System.in);
// int cc = sc.nextInt();
// String [] n = new String[cc];
// for(int i =0;i<cc;i++){
// n[i] = sc.next();
// TenToEig(SixToTen(n[i]));
// }
// }
// public static long SixToTen(String n){
// Map<Character,Integer> map = new HashMap<Character, Integer>();
// for(int i = 0;i<10;i++){
// map.put((char)(48+i),i);
// }
// for(int i=0;i<7;i++){
// map.put((char)(65+i), 10+i);
// }
// long [] arr = {1,16,256,4096,65536,1048576,16777216,268435456};
// char [] arr2 = n.toCharArray();
// char [] arr3 = new char[arr2.length];
// for(int i=0;i<arr2.length;i++){
// arr3[i]=arr2[arr2.length-i-1];
// }
// long sum=0;
// for(int i =arr3.length-1;i>=0;i--){
// sum+=(arr[i]*map.get(arr3[i]));
// }
// return sum;
// }
// public static void TenToEig(long n){
// Map<Long, String> map = new HashMap<Long, String>();
// for(long i=0;i<9;i++){
// map.put(i,String.valueOf(i));
// }
// List<Long> list = new ArrayList<Long>();
// long b=0;//作為商
// long c=0;//作為餘數
// boolean flag = true;
// while(flag==true){
// c=n%8;
// list.add(c);
// b=n/8;
// n=b;
// if(b<8){
// if(b!=0){
// list.add(b);
// }
// flag=false;
// }
// }
// for(int i=list.size()-1;i>=0;i--){
// System.out.print(map.get(list.get(i)));
// }
// }
//方式二(自帶的函式)
// public static void main(String[] args) {
// Scanner scanner = new Scanner(System.in);
// int n = scanner.nextInt();
// String[] sts = new String[n+1];
// for(int i=0;i<n;i++){
// sts[i] = scanner.next();
// }
// scanner.close();
//
// for(int i=0;i<n;i++){
// long a = Long.valueOf(sts[i], 16);
// String b = Long.toOctalString(a);
// System.out.println(b);
// }
//
// }
//方式三(提交通過)
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] sts = new String[n+1];
for(int i=0;i<n;i++){
sts[i] = scanner.next();
}
scanner.close();
for(int i=0;i<n;i++){
String strBinary = toBinary(sts[i]);
int len_strBin = strBinary.length();
if(len_strBin%3==1) strBinary = "00" + strBinary;
if(len_strBin%3==2) strBinary = "0" + strBinary;
String strOctal = toOctal(strBinary);
System.out.println(strOctal);
}
}
private static String toOctal(String strBinary) {
int len = strBinary.length();
int k;
StringBuffer stb = new StringBuffer();
if(strBinary.substring(0, 3).equals("000")) k=3;
else k=0;
for(int i=k;i<len-2;i+=3){
String string = strBinary.substring(i,i+3);
if(string.equals("000")) stb.append("0");
else if(string.equals("001")) stb.append("1");
else if(string.equals("010")) stb.append("2");
else if(string.equals("011")) stb.append("3");
else if(string.equals("100")) stb.append("4");
else if(string.equals("101")) stb.append("5");
else if(string.equals("110")) stb.append("6");
else if(string.equals("111")) stb.append("7");
}
return stb.toString();
}
private static String toBinary(String strHex) {
int len_str = strHex.length();
StringBuffer stb = new StringBuffer();
for(int i=0;i<len_str;i++){
switch (strHex.charAt(i)) {
case '0': stb.append("0000"); break;
case '1': stb.append("0001"); break;
case '2': stb.append("0010");break;
case '3': stb.append("0011"); break;
case '4': stb.append("0100"); break;
case '5': stb.append("0101"); break;
case '6': stb.append("0110"); break;
case '7': stb.append("0111"); break;
case '8': stb.append("1000"); break;
case '9': stb.append("1001"); break;
case 'A': stb.append("1010"); break;
case 'B': stb.append("1011"); break;
case 'C': stb.append("1100"); break;
case 'D': stb.append("1101"); break;
case 'E': stb.append("1110"); break;
case 'F': stb.append("1111"); break;
default: break;
}
}
return stb.toString();
}
}