• 蓝桥杯 之 基础练习12:十六进制转八进制


    /*问题描述

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

    输入格式

      输入的第一行为一个正整数n (1<=n<=10)。

      接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

    输出格式

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

    注意

      输入的十六进制数不会有前导0,比如012A。

      输出的八进制数也不能有前导0。

    样例输入

    2

    39

    123ABC

    样例输出

    71

    4435274

    提示

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

    心得:

      这道题与前面两道进制转换题目相比,难度加大。一开始想的也是把16进制先转化为10进制,因为从10进制转化为8进制比较容易。但题目中规定输入的16进制位数规模大,由于不超过100000位,故不能化为10进制数。解法是先把16进制化为四个2进制数,然后三个二进制数一组再化为8进制(注意 是从二进制的低位开始三个一组来计算)。

      在这道题中,我一开始使用Scanner输入,不过忘记了Scanner取得输入的依据是空格符,按下空格键、【Tab】键或【Enter】键,Scanner就会直接返回下一个输入,这样的话,输入格式就没办法向题目要求的那样换行输入,因此在这里Scanner输入并不适用。当使用者输入一个字符时中间会包括空格符,(如题目中就要求包括输入【Enter】换行),而我们希望取得完整的字符串,想要取得包括空格符在内的输入,这时就要使用BufferedReader输入流取得输入。

      在这道题中,我操作字符串时创建了StringBuffer类对象,而不是String类,因为StringBuffer类便于对一个字符串进行修改,如插入、删除等操作。在这里,我进一步去了解了一下StringBuffer类,在之后的随笔中会总结一下它的用法、优点及与String类的区别。

      写完这道题之后,发现代码好长,想试一下有没有更简化一些的代码

      1 //import java.util.Scanner;
      2 import java.io.*;
      3 public class Main{
      4     public static void main (String args[]) throws IOException{
      5         //Scanner sc= new Scanner(System.in);
      6         //int n=sc.nextInt();
      7         BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
      8         int n=Integer.parseInt(buf.readLine());        //输入一个整数n,由字符串转成整型
      9         String str[]=new String[n];                //创建字符串数组,数组长度为n
     10         for(int i=0;i<n;i++){
     11         //str[i]=sc.nextLine();
     12             str[i]=buf.readLine();            //输入n个字符串
     13         }
     14         for(int j=0;j<n;j++){
     15             transform(str[j]);                //调用转换成二进制的方法
     16         //    System.out.print(str[j]+"	");
     17         }
     18     }
     19     public static void transform(String s){            //将十六进制转换成二进制的方法,传入输入的字符串参数
     20         StringBuffer st=new StringBuffer();            //创建StringBuffer类对象,便于对一个字符串进行修改,例如插入、删除等操作,
                                        使用StringBuffer要更加适合一些。
    21 char c[]=s.toCharArray(); //将字符串对象中的字符转换为一个字符数组 22 for(int i=0;i<c.length;i++){ 23 switch(c[i]){ //用switch循环,进行转换 24 case '0':{ 25 st.append("0000"); //append方法,该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接 26 break; 27 } 28 case '1':{ 29 st.append("0001"); 30 break; 31 } 32 case '2':{ 33 st.append("0010"); 34 break; 35 } 36 case '3':{ 37 st.append("0011"); 38 break; 39 } 40 case '4':{ 41 st.append("0100"); 42 break; 43 }case '5':{ 44 st.append("0101"); 45 break; 46 }case '6':{ 47 st.append("0110"); 48 break; 49 }case '7':{ 50 st.append("0111"); 51 break; 52 }case '8':{ 53 st.append("1000"); 54 break; 55 }case '9':{ 56 st.append("1001"); 57 break; 58 }case 'A':{ 59 st.append("1010"); 60 break; 61 }case 'B':{ 62 st.append("1011"); 63 break; 64 }case 'C':{ 65 st.append("1100"); 66 break; 67 } 68 case 'D':{ 69 st.append("1101"); 70 break; 71 } 72 case 'E':{ 73 st.append("1110"); 74 break; 75 } 76 case 'F':{ 77 st.append("1111"); 78 break; 79 } 80 } 81 } 82 transform_02(st); //调用将二进制转换成八进制的方法 83 } 84 public static void transform_02(StringBuffer s){ //将二进制转换成八进制的方法,传入字符数组元素转换后组成的二进制字符串 85 int i=s.length(); //传入的字符串长度 86 System.out.println(s); 87 System.out.println(i); 88 //由每个十六进制数长度不超过100000。故s的长度最长为4*6=24,即i<=24,i%3的余数有:0,1,2 89 if(i%3==0){ //判断,输入的十六进制数不会有前导0,比如012A。 90 if(s.substring(0,3).equals("000")) 91 s.delete(0,3); //除去前导“0”,输出的八进制数也不能有前导0。 92 93 } 94 if(i%3==1){ 95 if(s.substring(0,1).equals("0")) 96 s.delete(0,1); 97 else 98 s.insert(0,"00"); 99 } 100 if(i%3==2){ 101 if(s.substring(0,2).equals("00")) 102 s.delete(0,2); 103 else 104 s.insert(0,"0"); 105 } 106 int n=s.length()/3; 107 String s1[]=new String[n]; 108 StringBuffer sbf=new StringBuffer(); 109 for(int j=0;j<n;j++){ //三个二进制数一组,再化为8进制 110 s1[j]=s.substring(j*3,j*3+3); 111 if(s1[j].equals("000")) 112 sbf.append("0"); 113 if(s1[j].equals("001")) 114 sbf.append("1"); 115 if(s1[j].equals("010")) 116 sbf.append("2"); 117 if(s1[j].equals("011")) 118 sbf.append("3"); 119 if(s1[j].equals("100")) 120 sbf.append("4"); 121 if(s1[j].equals("101")) 122 sbf.append("5"); 123 if(s1[j].equals("110")) 124 sbf.append("6"); 125 if(s1[j].equals("111")) 126 sbf.append("7"); 127 } 128 String s2=sbf.toString(); // 129 System.out.println(s2); //输出转换后的八进制 130 } 131 }
  • 相关阅读:
    hbase伪分布式安装
    按照《权威指南》的例子求最低温度并且修改默认调度器为FairScheduler
    利用hadoop1.x集群进行探索性实验(四)~(五)【重复格式化NN后,DN不能启动】【控制namenode检查点发生的频率】
    利用hadoop1.x集群进行探索性实验(三)【修改HDFS块大小】
    利用hadoop1.x集群进行探索性实验(二)【模拟namenode崩溃,通过secondary namenode恢复namenode】
    利用hadoop1.x集群进行探索性实验(一)【对WEB监控界面增加安全机制】
    本地编译64位hadoop并进行部署。
    hadoop完全分布式安装
    storm集群和zookeeper集群的部署过程
    查看电脑连接过的wifi密码
  • 原文地址:https://www.cnblogs.com/beckljm/p/4255243.html
Copyright © 2020-2023  润新知