藍橋杯 十六進制轉八進制 字符串處理

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

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

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

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

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

思路:
一開始先將十六進制轉換成10進制,再轉換成8進制。結果出錯,因爲數的範圍在2的4*10e5次方範圍內,long long也無法表示,只能字符串來做,就是先把16進制轉換成2進制,再從2進制轉換成8進制。


public class SixteenToEight {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int sum; 
        int item; 
        int start = 0; 
        for (int count=0; count<n; count++ ) {
            String input = sc.next();
            String BinaryString = transform(input);
//          System.out.println(BinaryString);
            int left = BinaryString.length()%3; 
            String temp = null;
            item = 1; 
            sum =  0; 
            start = 0; 
            if ( left==1 ) {
                temp = BinaryString.substring(0,left); 
                for ( int i=left-1; i>=0; i-- ) {
                    sum += item*(int)( temp.charAt(i)-'0' );
                    item *= 2; 
                }
                if ( sum!=0 )
                    System.out.print(sum);
                start = 1;  
            }
            if ( left==2 ) {
                temp = BinaryString.substring(0,left); 
                for ( int i=left-1; i>=0; i-- ) {
                    sum += item*(int)( temp.charAt(i)-'0' );
                    item *= 2; 
                }
                if ( sum!=0 )
                    System.out.print(sum);

                start = 2; 
            }

            for ( ; start<BinaryString.length(); start+=3 ) {
                sum = 0 ; 
                item = 4 ;  
                for ( int i=0; i<3; i++ ) {
                    sum += item*(int)( BinaryString.charAt(i+start)-'0' );
                    item /=2 ; 
                }
                if ( start==0 && sum==0 ) continue; 
                System.out.print(sum);
            }
            System.out.println();
        }

    }

    public static String transform( String origin ) {
        StringBuilder ans = new StringBuilder("");
        String s = null; 
        for ( int i=0; i<origin.length(); i++ ) {
            switch ( origin.charAt(i) ) {
            case '0':
                s = "0000"; 
                break;
            case '1': 
                s = "0001"; 
                break; 
            case '2':
                s = "0010"; 
                break; 
            case '3':
                s = "0011"; 
                break; 
            case '4':
                s = "0100"; 
                break ; 
            case '5': 
                s = "0101"; 
                break; 
            case '6':
                s = "0110";
                break; 
            case '7':
                s = "0111"; 
                break; 
            case '8':
                s = "1000"; 
                break; 
            case '9':
                s = "1001"; 
                break; 
            case 'A':
                s = "1010"; 
                break; 
            case 'B':
                s = "1011"; 
                break; 
            case 'C':
                s = "1100"; 
                break; 
            case 'D':
                s = "1101"; 
                break; 
            case 'E':
                s = "1110"; 
                break; 
            case 'F':
                s = "1111"; 
                break; 
            default:
                break;
            }
            ans.append(s);
        }
        return ans.toString(); 
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章