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

介绍一种通过二进制作为中介实现十六进制到八进制转换的方法,适用于大数值转换,避免了直接转换可能导致的数据溢出问题。

问题描述
  给定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(); 
    }
}
蓝桥杯相关问题中,要使用Python实现十六进制八进制,可参考以下几种方法: ### 方法一 ```python n=int(input()) li=[] for i in range(n): if n<=10: s=input() if len(s)<=100000: res_1=int(s,16) res_2=oct(res_1) li.append(res_2[2:]) for i in li: print(i,end='\n') ``` 此方法先将十六进制通过 `int(s, 16)` 换为十进制,再用 `oct()` 函将十进制换为八进制,最后取结果从第三位开始的部分存入列表并输出 [^1]。 ### 方法二 ```python n=int(input()) m=[] for i in range(n): num=input() result=int(num,16) result1=oct(result)[2:] m.append(result1) for j in m: print(j) ``` 该方法同样先把十六进制换为十进制,接着用 `oct()` 函换为八进制,去掉前缀“0O”后存入列表并输出 [^2]。 ### 方法三 ```python def main(): n=int(input()) lst=[] for i in range(n): num1=input() lst.append(num1) for num2 in lst: print('{:o}'.format(int(('0x'+num2),16))) main() ``` 这种方法先将输入的十六进制字符串加上“0x”前缀,再用 `int()` 函换为十进制,最后使用字符串格式化 `'{:o}'` 将其换为八进制并输出 [^1][^3]。 ### 方法四 ```python n = int(input()) i = 0 list = [] while True: if i>=n: break list.append(input()) i += 1 for i in range(0,len(list)): a = list[i] b = int(a,16) c = oct(b) print(c[2:]) ``` 此方法通过 `while` 循环获取输入,将十六进制换为十进制换为八进制,去掉前缀后输出 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值