java实现大数的十六进制转八进制

jupiter
2022-03-08 / 0 评论 / 597 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年03月08日,已超过773天没有更新,若内容或图片失效,请留言反馈。

1.问题描述

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0-9、大写字母A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

2.代码实现

import java.util.Scanner;

public class Main {
    //16进制转2进制
    public static String hex2Bin(String hex){
        StringBuilder sb = new StringBuilder();
        char[] hex_chars = hex.toCharArray();
        for(char item:hex_chars){
            switch (item){
                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;
                default:sb.append("ERROR");break;
            }
        }

        return sb.toString();
    }

    //2进制转8进制
    public static String bin2Otc(String bin){
        StringBuilder sb = new StringBuilder();

        //将字符串的长度补齐到3的整数倍
        int binLength = bin.length();
        if(binLength%3==1){
            bin = "00"+bin;
        }else if(binLength%3==2){
            bin = "0"+bin;
        }

        //每3位转换出一个8进制数
        for(int i=0;i<bin.length()/3;i++){
            String octItem = bin.substring(i*3,i*3+3);
            switch (octItem){
                case "000":sb.append("0");break;
                case "001":sb.append("1");break;
                case "010":sb.append("2");break;
                case "011":sb.append("3");break;
                case "100":sb.append("4");break;
                case "101":sb.append("5");break;
                case "110":sb.append("6");break;
                case "111":sb.append("7");break;
                default:sb.append("ERROR");break;
            }
        }

        return sb.toString();
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num_count = scanner.nextInt();
        String []nums = new String[num_count];
        for(int i=0;i<num_count;i++){
            nums[i] = scanner.next();
        }

        for(int i=0;i<num_count;i++){
            String bin = hex2Bin(nums[i]);
            String oct = bin2Otc(bin);

            if(oct.charAt(0)=='0'){
                oct = oct.substring(1);
            }

            System.out.println(oct);
        }
    }
}

参考资料

1.http://lx.lanqiao.cn/problem.page?gpid=T51

0

评论 (0)

打卡
取消