基础练习 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

找了一天错误

package lanqiao_jichu;

import java.util.Scanner;
//没过 输入是加了while循环导致运行超时 
public class shiliu_shift_ba {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            String[] strings = new String[n];
            //String str;
            for (int i = 0; i < n; i++) {
                String s=scanner.next();
                strings[i] = s;
               // System.out.println(strings[i]);
            }
            shift2(strings,n);//转二进制

       /* for (int j = 0; j < n; j++) {
            // int i,len=0;//从每个串的第一个字符进行判断
            String str="";

            int len=strings[j].length();
            int i=len;
            StringBuilder sb=new StringBuilder();
            while (i!=0){
                switch (strings[j].charAt(len-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--;
            }
            str=sb.toString();
            if (str.length()%3==1) str="00"+str;
            else if (str.length()%3==2) str="0"+str;
            // System.out.println("str:"+str);
            shift8(str);

            System.out.println();

        }
       // }*/
    }

    public static void shift2(String[] strings,int n){
        for (int j = 0; j < n; j++) {
            // int i,len=0;//从每个串的第一个字符进行判断
            String str="";
            StringBuilder sb=new StringBuilder();
             int len=strings[j].length();
             int i=len;

             while (i!=0){
                 switch (strings[j].charAt(len-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--;
             }
             str=sb.toString();
             if (str.length()%3==1) str="00"+str;
             else if (str.length()%3==2) str="0"+str;
           // System.out.println("str:"+str);
             shift8(str);

            System.out.println();

        }
    }

    public static void shift8(String str){
        int len= str.length();
        int num = (str.charAt(0)-'0')*4 +(str.charAt(1)-'0')*2+(str.charAt(2)-'0');//从左到右算首部
        //首部3位换算结果 若为0则不输出 否则输出
        if (num!=0) System.out.print(num);//一开始写的println 提交答案错误
        for (int i=3; i<len; i+=3){
            num = (str.charAt(i)-'0')*4 +(str.charAt(i+1)-'0')*2+(str.charAt(i+2)-'0');//从左第4位数开始,每3位换算
            System.out.print(num);
        }

    }
}

别人的思路
1位16进制可以代表4位2进制, 1位8进制可以代表3位二进制,得出3位16进制求和入栈输出表示4位8进制,然后出栈输出。

而且String str1=Integer.toOctalString(stack[i]);//从10进制转化成8进制

package lanqiao_jichu;
import java.util.Scanner;
public class Mains {
    public static void main(String[] args) {
        new Mains().systemScanner();
    }
    public void systemScanner() {
        Scanner jin = new Scanner(System.in);
        while (jin.hasNext()) {
            int length = jin.nextInt();
            for (int i = 0; i < length; i++){
                String strTmp=jin.next();
                tranform(strTmp.toCharArray(), strTmp.length());
            }
        }
    }
    /*
     * 3位16进制等价于4位8进制
     */
    int[] stack=new int[40000];
    public void tranform(char[] str, int length) {
        char[] buff = new char[4];
        int top = -1;
        for (int i = length - 1; i >= 0; i -= 3) {
            int sum = 0;
            for (int j = 0; j < 3 && i - j >= 0; j++) {// i-j>=0防止不够三个的情况
                int tmp = str[i - j] >= '0' && str[i - j] <= '9' ? str[i - j] - '0'
                        : str[i - j] - 'A' + 10;//区分是数字,还是字符,进行对应转换
                sum+=(tmp<<(4*j));//这句很重要,通过这句就可以从16变成10进制了,不过,不知道为什么?是如何得出的呢?而且进行累加之后就能得到最终的结果很神奇
            }
            stack[++top]=sum;//sum的结果是16进制转化10进制的结果,每3个16进制变成10进制,再变8进制
        }
        while(stack[top]==0){//排除前导为0的判断
            top--;
        }
//      for(int i=top;i>=0;i--){//直接输出会丢失前导0,因为此转化成8进制并不是最左边的情况,应该保留0
//          System.out.print(Integer.toOctalString(stack[i]));//从10进制转化成8进制
//      }
        for(int i=top;i>=0;i--){
            String str1=Integer.toOctalString(stack[i]);//从10进制转化成8进制
            if(i!=top&&str1.length()<4){
                //不是最左边的一个,就不用去掉前导0,而默认是去掉0的,所以要进行补会
                for(int y=0;y<4-str1.length();y++)
                    System.out.print("0");
            }
            System.out.print(str1);
        }
        System.out.println();

    }
}

java 二、八、十、十六进制之间的转换
public static void main(String[] args) {
int n1 = 14;
//十进制转成十六进制:
System.out.println(Integer.toHexString(n1));
//十进制转成八进制
System.out.println(Integer.toOctalString(n1));
//十进制转成二进制
System.out.println(Integer.toBinaryString(12));
//十六进制转成十进制
System.out.println(Integer.valueOf(“FFFF”,16).toString());
//十六进制转成二进制
System.out.println(Integer.toBinaryString(Integer.valueOf(“FFFF”,16)));
//十六进制转成八进制
System.out.println(Integer.toOctalString(Integer.valueOf(“FFFF”,16)));

    //八进制转成十进制
    System.out.println(Integer.valueOf("576",8).toString());
    //八进制转成二进制
    System.out.println(Integer.toBinaryString(Integer.valueOf("23",8)));
    //八进制转成十六进制
    System.out.println(Integer.toHexString(Integer.valueOf("23",8)));


    //二进制转十进制
    System.out.println(Integer.valueOf("0101",2).toString());
    //二进制转八进制
    System.out.println(Integer.toOctalString(Integer.parseInt("0101", 2)));
    //二进制转十六进制
    System.out.println(Integer.toHexString(Integer.parseInt("0101", 2)));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值