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

问题描述

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

猜你喜欢

转载自www.cnblogs.com/LieYanAnYing/p/12178729.html