1. 程式人生 > >十六進位制轉八進位制

十六進位制轉八進位制

問題描述

   給定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();

}

}