1. 程式人生 > >藍橋杯演算法題:十六進位制轉8進位制

藍橋杯演算法題:十六進位制轉8進位制

問題描述   給定n個十六進位制正整數,輸出它們對應的八進位制數。

輸入格式   輸入的第一行為一個正整數n (1<=n<=10)。   接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。

輸出格式   輸出n行,每行為輸入對應的八進位制正整數。

【注意】   輸入的十六進位制數不會有前導0,比如012A。   輸出的八進位制數也不能有前導0。

樣例輸入   2   39   123ABC

樣例輸出   71   4435274

【提示】   先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。

解法

import java.util.Scanner;

public class Trans {
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        String[] array=new String[n];
        //16進位制轉換二進位制
        StringBuffer[] result=new StringBuffer[n];

        for(int u=0;u<n;u++){
            array[u]=scanner.next();
            int length=array[u].length();
            int i=length;
            StringBuffer sb=new StringBuffer();
            while(i!=0){
                switch (array[u].charAt(length-i)){
                    case '0':
                        sb.append("0000");
                        break;
                    case '1':
                        sb.append("0001");
                        break;
                    case '2':
                        sb.append("0010");
                        break;
                    case '3':
                        sb.append("0011");
                        break;
                    case '4':
                        sb.append("0100");
                        break;
                    case '5':
                        sb.append("0101");
                        break;
                    case '6':
                        sb.append("0110");
                        break;
                    case '7':
                        sb.append("0111");
                        break;
                    case '8':
                        sb.append("1000");
                        break;
                    case '9':
                        sb.append("1001");
                        break;
                    case 'A':
                        sb.append("1010");
                        break;
                    case'B':
                        sb.append("1011");
                        break;
                    case 'C':
                        sb.append("1100");
                        break;
                    case 'D':
                        sb.append("1101");
                        break;
                    case 'E':
                        sb.append("1110");
                        break;
                    case 'F':
                        sb.append("1111");
                        break;
                }
                --i;
            }
            result[u]=sb;
        }
        //二進位制轉八進位制
        for(int k=0;k<n;k++){
            String b=result[k].toString();
            if(result[k].length()%3==1){
                b="00"+result[k];
            }
            else if(result[k].length()%3==2){
                b="0"+result[k];
            }
            //讓輸出結果的開頭不會為零
            int length=b.length();
            //因為'0'的acci碼是48,而不是從0開始,所以要char與整形進行運算要得到正確結果都要-‘0’,保證結果正確;
            int a=(b.charAt(0)-'0')*4+(b.charAt(1)-'0')*2+(b.charAt(2)-'0');
            if(a!=0)
                System.out.print(a);
            for(int e=3;e<length;e++){
                int s=(b.charAt(e)-'0')*4+(b.charAt(e+1)-'0')*2+(b.charAt(e+2)-'0');
                e+=2;
                System.out.print(s);
            }
            System.out.println();
        }
    }
}

注意

類名必須是Main,以上程式碼並沒有改,而且這題做的話最好用StringBuffer或StringBuilder來操作字串,不然單純用String效率會很低,提交到系統的話可能會操作超時