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

问题描述
  给定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(); 
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值