• 十六进制转八进制_蓝桥杯


    问题描述

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

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

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

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

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

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

    代码

    /**
     *首先十六进制To二进制,然后二进制To八进制
     *利用switch进行转换,比如A转换为1010,利用字符串进行拼接,最后三个三个提取出来转化为八进制 
    **/
    package jiChuLianXi;
    
    import java.util.Scanner;
    
    public class HexadecimaToOctal {
    
        static String hTo(String s){
            //16T2
            StringBuilder s1=new StringBuilder(), s3=new StringBuilder();
            for(int i=0; i<s.length(); i++){
                switch(s.charAt(i)){
                case '0':s1.append("0000");break;   
                 case '1':s1.append("0001");break;   
                 case '2':s1.append("0010");break;   
                 case '3':s1.append("0011");break;   
                 case '4':s1.append("0100");break;   
                 case '5':s1.append("0101");break;   
                 case '6':s1.append("0110");break;   
                 case '7':s1.append("0111");break;   
                 case '8':s1.append("1000");break;   
                 case '9':s1.append("1001");break;   
                 case 'A':s1.append("1010");break;   
                 case 'B':s1.append("1011");break;   
                 case 'C':s1.append("1100");break;   
                 case 'D':s1.append("1101");break;   
                 case 'E':s1.append("1110");break;   
                 case 'F':s1.append("1111");break;   
                 default:break;   
                }
            }
            //补位使为3的倍数,因为一个八进制数用三位二进制数表示
            if(s1.length()%3==1)
                s1.insert(0,"00");
            else if(s1.length()%3==2)
                s1.insert(0,"0");
            //2T8
            int a=(s1.charAt(0)-'0')*4+(s1.charAt(1)-'0')*2+(s1.charAt(2)-'0');  //为了不出现前导0
            if(a!=0)
                s3.append(a+"");            //若a!=0就直接输出了
            for(int i=3;i<=s1.length()-2;i+=3)   
            {   
                   a=(s1.charAt(i)-'0')*4+(s1.charAt(i+1)-'0')*2+(s1.charAt(i+2)-'0');   
                   s3.append(a+"");  
            }
            return s3.toString();
        }
        
        public static void main(String argv[]){
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            String[] str = new String[n];
            for(int i=0; i<n; i++){
                str[i] = in.next();
            }
            in.close();
            for(int i=0; i<n; i++)
                System.out.println(hTo(str[i]));
        }
    }

      注意!注意!注意!在循环里使用“+”进行字符串连接是魔鬼!它生生将程序的运行时间和运行内存提高了四五倍。。。在进行断断续续连接成一个字符串时,应尽可能使用StringBuilder.append(String str);关于两者的区别,请见:https://blog.csdn.net/m0_37589327/article/details/78605268

  • 相关阅读:
    使用Git--将本地项目提交到Github
    海量数据处理面试题
    web前后端安全问题
    mysql关键字如何当字段使用
    一个Java项目开发流程(正规级别)
    开发工具idea中撤回代码和恢复撤销代码快捷键
    layui前端使用
    shiro标签
    常见SVN图标的含义
    最常见到的runtime exception 异常
  • 原文地址:https://www.cnblogs.com/LieYanAnYing/p/12178729.html
Copyright © 2020-2023  润新知