十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

import java.util.Scanner;

import java.util.Scanner;  
public class Main {  
    public static void main(String[] args)  
    {  
        Scanner sc =new Scanner(System.in);
        int count = sc.nextInt();
        String []arr =new String[count];
        for(int i=0;i<count ;i++) {
            arr[i]=sc.next();
        }
        for(int j=0;j<arr.length;j++) {
            System.out.println(take2to8(take16to2(arr[j])));
        }
    } 
    public static String take16to2(String str) {
        StringBuffer sBuffer= new StringBuffer();
        for(int i=0;i<str.length();i++) {
            switch (str.charAt(i)) {
            case '0':sBuffer.append("0000");
            break;
            case '1':sBuffer.append("0001");
            break;
            case '2':sBuffer.append("0010");
            break;
            case '3':sBuffer.append("0011");
            break;
            case '4':sBuffer.append("0100");
            break;
            case '5':sBuffer.append("0101");
            break;
            case '6':sBuffer.append("0110");
            break;
            case '7':sBuffer.append("0111");
            break;
            case '8':sBuffer.append("1000");
            break;
            case '9':sBuffer.append("1001");
            break;
            case 'A':sBuffer.append("1010");
            break;
            case 'B':sBuffer.append("1011");
            break;
            case 'C':sBuffer.append("1100");
            break;
            case 'D':sBuffer.append("1101");
            break;
            case 'E':sBuffer.append("1110");
            break;
            case 'F':sBuffer.append("1111");
            break;
            default:
                break;
            }
        }
        return sBuffer.toString();
    }
    public static String take2to8(String str){
        StringBuffer resultBuf =new StringBuffer() ;
        if(str.length()%3==1) {
            str ="00" +str ; 
        }else if(str.length()%3==2){
            str ="0" +str ; 
        }
        for(int i=0;i<=str.length()-3;i+=3) {
            switch (str.substring(i, i+3)) {
            case "000":
                if(i==0) {
                    break;
                }else {
                    resultBuf.append("0");
                    break;
                }
            case "001":
                resultBuf.append("1");
                break;
            case "010":
                resultBuf.append("2");
                break;
            case "011":
                resultBuf.append("3");
                break;
            case "100":
                resultBuf.append("4");
                break;
            case "101":
                resultBuf.append("5");
                break;
            case "110":
                resultBuf.append("6");
                break;
            case "111":
                resultBuf.append("7");
                break;
            default:
                break;
            }
        }
        return resultBuf.toString();
    }
}

结果
输入:
3
AAAABBB
EDEDED
FEFEFEF
输出:
252525356
7336675
376775773

给一个别人的编译不出错的代码:

import java.util.Scanner;  
public class Main {  
    public static void toOctal(String  s){  
        int length,a;  
        length=s.length();  
        a=(s.charAt(0)-'0')*4+(s.charAt(1)-'0')*2+(s.charAt(2)-'0');  
        if(a!=0) System.out.print(a);  
        for(int i=3;i<length;i+=3)  
        {     
             a=(s.charAt(i)-'0')*4+(s.charAt(i+1)-'0')*2+(s.charAt(i+2)-'0');     
             System.out.print(a);    
               }  
    }  

    public static void main(String[] args) {  
        int i,length,n,j;  
        Scanner sc=new Scanner(System.in);  
        n=sc.nextInt();  
        String [] o=new String[10];  

        String b;  
        for(j=0;j<n;j++){  
            String s=sc.next();  
            o[j]=s;  
        }  

        for(j=0;j<n;j++){  
        b="";  
        length=o[j].length();  
        i=length;  
        StringBuilder sb=new StringBuilder();  
        while(i!=0){  
            switch(o[j].charAt(length-i)){  
            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;  
            }  
            i--;  
            }  
        b=sb.toString();  
        if(b.length()%3==1) b="00"+b;  
        else if(b.length()%3==2) b="0"+b;  
        toOctal(b);  
        System.out.println();  
            }  
        }  
    }

猜你喜欢

转载自blog.csdn.net/cqx13763055264/article/details/79415337
今日推荐