zoukankan      html  css  js  c++  java
  • 十六进制转八进制_蓝桥杯

    问题描述

      给定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

  • 相关阅读:
    线程同步的三种方式(Mutex,Event,Critical Section) 沧海
    VC++多线程下内存操作的优化 沧海
    C++内存对象大会战 沧海
    技术关注:搜索引擎经验 沧海
    jira 3.13.5版 安装 配置 用户权限控制 拂晓风起
    C++ int string 转换 拂晓风起
    C++调用C链接库会出现的问题 拂晓风起
    Windows Server 2003 IIS Service Unavailable 问题解决 拂晓风起
    研究 学术 开发 的好用工具(不包括常见的) 拂晓风起
    SGMarks 问世 (Firefox扩展Gmarks的扩展版) 纯属学习 拂晓风起
  • 原文地址:https://www.cnblogs.com/LieYanAnYing/p/12178729.html
Copyright © 2011-2022 走看看