zoukankan      html  css  js  c++  java
  • 蓝桥杯之16进制转8进制

    题目:

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

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

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

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

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

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

    因为在蓝桥杯官网下的练习系统中使用的jdk版本为1.6,在1.6中switch方法貌似不支持判断字符串,所以就改成了if...elseif...的处理方式。

    import java.util.Scanner;

    public class Main {

    /**
    * @param args
    */
    public static void main(String[] args) {


    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    String[] strs = new String[n];
    for(int i=0;i<n;i++){
    strs[i] = sc.next();
    }
    sc.close();


    for(int j=0;j<n;j++){
    String binary = toBinary(strs[j]);
    if(binary.length()%3==2) binary = "0"+binary;
    if(binary.length()%3==1) binary = "00"+binary;

    System.out.println(toOctonary(binary));
    }

    }

    public static String toOctonary(String s){
    int z;
    if(s.substring(0,3).equals("000"))
    z = 3;
    else {
    z = 0;
    }
    int l = s.length();
    StringBuffer sBuffer = new StringBuffer();
    for(int i = z; i < l-2; i+=3){
    if(s.substring(i,i+3).equals("000"))
    sBuffer.append("0");
    else if (s.substring(i,i+3).equals("001"))
    sBuffer.append("1");
    else if (s.substring(i,i+3).equals("010"))
    sBuffer.append("2");
    else if (s.substring(i,i+3).equals("011"))
    sBuffer.append("3");
    else if (s.substring(i,i+3).equals("100"))
    sBuffer.append("4");
    else if (s.substring(i,i+3).equals("101"))
    sBuffer.append("5");
    else if (s.substring(i,i+3).equals("110"))
    sBuffer.append("6");
    else if (s.substring(i,i+3).equals("111"))
    sBuffer.append("7");
    }
    return sBuffer.toString();
    }

    public static String toBinary(String str){
    StringBuffer sBuffer = new StringBuffer();
    int l = str.length();
    for(int i = 0; i < l; 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();
    }
    }

    这是参考了一位博客兄的文章在自己实践的,思路是基本参照他的。

    1.利用循环读取控制台的输入

    2.在16进制转2进制过程中,建立一个StringBuffer对象,利用了for循环+chatAt()方法一个一个地读取16进制数,读取到的字符利用switch方法去识别是0或1或2....到F,然后就利用StringBuffer对象的append()方法对应地追加"0000"或"0001"等等,在返回这个StringBuffer.toString()的字符串。

    3.然后到了2进制转换为8进制。因为在上面中转换过来的二进制位数不一定是3的倍数(因为一个8进制数对应3位二进制数),所以对转换过来的2进制数进行补位数。在利用和转换16进制数差不多的方法前,需要注意的是题目要求中不允许输出的8进制数是0开头的,所以在这对二进制数进行了一次开头是3个000的就从3开始判断(题目说明输入的16进制不会是0开头的,所以只要做一次判断就可以了)。

    4.通过以上的转换,就可以输出了,100分通过。

  • 相关阅读:
    Docker安装mysql
    解决SpringMVC+Thymeleaf中文乱码
    Web API 自动生成接口文档
    .Net Core 定时任务TimeJob
    使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云
    SQLServer · 最佳实践 · 如何将SQL Server 2012降级到2008 R2-博客-云栖社区-阿里云
    PNG文件转png8
    实战ASP.NET访问共享文件夹(含详细操作步骤)
    MVC JsonResult
    你必须知道的EF知识和经验
  • 原文地址:https://www.cnblogs.com/z-jx/p/8541975.html
Copyright © 2011-2022 走看看