蓝桥杯 十六进制转八进制 字符串处理

问题描述
  给定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(); 
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章