【无标题】蓝桥杯java 给定n个十六进制正整数,输出它们对应的八进制数

做这道题时,编译器上没问题,放到蓝桥杯上就出问题了,后来网上搜了下,才知道看错题了,输入数据长度不超过100000,不是大小。然后看到一位大佬用C语言写的,三位三位的转换。
C代码链接[https://zhuanlan.zhihu.com/p/455497136]
然后下面是我自己用java实现的,有注释我自己的理解。

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

package pra1220;

import java.util.Scanner;

/**
 * 资源限制
 * 时间限制:1.0s   内存限制:512.0MB
 * 问题描述
 *   给定n个十六进制正整数,输出它们对应的八进制数。
 *
 * 输入格式
 *   输入的第一行为一个正整数n (1<=n<=10)。
 *   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
 *
 * 输出格式
 *   输出n行,每行为输入对应的八进制正整数。
 *
 *   【注意】
 *   输入的十六进制数不会有前导0,比如012A。
 *   输出的八进制数也不能有前导0。
 *
 * 样例输入
 *   2
 *   39
 *   123ABC
 *
 * 样例输出
 *   71
 *   4435274
 *
 *   【提示】
 *   先将十六进制数转换成某进制数,再由某进制数转换成八进制。
 */

public class Basic12{
    public static void main(String[] args) {
        /**
         * 解决思路,3个十六进制(12位二进制)对应4个八进制(12位二进制),把一个十六进制的数拆成一堆三位三位的数,然后三位三位的转换为八进制,最后拼起来就是最终结果
         * 首先对于给定的十六进制输入长度取余,如果不是3的整数倍,则在第一次进行分段转换时根据缺的位数在前面补零
         * n:需要输入的数据个数
         * b[3](char[]):暂存3个十六进制
         * first(boolean):对于每个十六进制数据,判断是否是最前面的三位(即第一次分段转换),然后根据需要进行补零
         * len:每一个十六进制数据的长度
         * temp_result(String):暂存一个十六进制数到八进制数转换过程的每次的小转换(3个16进制位换成4个八进制位)结果
         */
        Scanner scanner = new Scanner(System.in);

        // 输入n个十十六进制数
        int n = scanner.nextInt();
        String[] input = new String[n];
        scanner.nextLine();  //消除回车键的影响
        for(int i=0;i<n;i++){
            input[i] = scanner.nextLine();
        }
        scanner.close();


        char[] b = new char[3];
        int len=0,d=0,k=0;
        Boolean first = true;
        String temp_result;

        for(int i=0;i<n;i++){
            len = input[i].length();    // 获取该十六进制数的长度
            k=0;
            d = len%3==0 ? 3 : len%3;   //判断十六进制数长度是否为3的整数倍
//            System.out.println("d"+d);
            if(d==2){   //不是整数倍,取余结果为2,该十六进制数前补1个0,凑3的整数被
                b[k++] = '0';
            }
            if(d==1){   //同理,不是整数倍,取余结果为1,补两个0
                b[k++] = '0';
                b[k++] = '0';
            }
            first = true;   //重新将first置为true

            /**
             * 将十六进制数转换为八进制数
             */
            for(int j=0;j<len;j++){

                b[k++] = input[i].charAt(j);    //取出该十六进制数的一位
                d--;
//                System.out.println(new String(b));
                if(d==0){   //当d==0,即b满了,成功取了3位十六进制数,开始转换为4位八进制数
                    d=3;k=0;    //重新置零
                    // 3位十六进制-->4位八进制
                    temp_result = Integer.toOctalString(Integer.parseInt(String.valueOf(b),16));
                    if(first){  //如果是第一次(前三位十六进制)则不进行补零操作,
                        first = false;
                    }else{  // 因为每次由转换得到的八进制结果可能不足4位(0x123--->0o0443,0443前面的零会被省略),如果不补零,那么合起来的结果就是错了
                        if(temp_result.length()==3){
                            temp_result = "0"+temp_result;
                        }else if(temp_result.length()==2){
                            temp_result = "00" + temp_result;
                        }else if(temp_result.length()==1){
                            temp_result = "000" +temp_result;
                        }else if(temp_result.length() == 0){
                            temp_result = "0000";
                        }
                    }
                    System.out.print(temp_result);  //直接输出转换后的4位八进制,但不换行,最后连起来就是一个16进制数转换的结果

                }
            }
            System.out.println();      //完成一个16进制数的转换,才换行
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值