蓝桥杯-十六进制转八进制 蛮详细

 进制转换

十六进制转八进制

问题描述

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

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

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

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

样例输入   2   39   123ABC

样例输出   71   4435274

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

大体思路

根据提示先把十六进制转换成二进制,再把二进制转换成八进制

十六进制转换二进制的方法

先来看看如何把十六进制转换成二进制

  1. 把字符串中的每一位拿出来

  1. 单独转换成二进制,不够四位补零

123ABC
0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 2
  1. 组合起来就是二进制的表示

二进制转八进制的方法
  1. 每三个二进制数位一组

  2. 百位乘4 十位乘2 个位乘1 相加

  3. 组合相加的数就是二进制转八进制的结果

0 0 10 1 00 1 1结果
0乘4+0乘2+1 乘1 = 1 0乘4+1乘2+0乘1 =2 0乘4+1乘2+1乘1=3 123
代码实现
 package lanqiaobie.base.jinzhi;
 
 import java.util.Scanner;
 
 /**
  * 十六进制转八进制
  */
 public class JInZhi16_8_12 {
     public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         String[] count =  new String[sc.nextInt()];
 
 //       把用户输入保存的数组中
         for (int i = 0; i < count.length; i++)
             count[i] = sc.next();
 //       遍历数组拿出字符串,拿出来一个转换一次
         for (int i = 0; i < count.length; i++)
             JInZhi16_2(count[i]);
    }
 
     /**
      * 十六进制转换字符串的方法
      * @param num 转换的十六进制字符串
      */
     public static void JInZhi16_2(String num) {
 
         StringBuffer result = new StringBuffer();
         //遍历字符串 拿出字符串的每个字符   从后向前拿
         for (int i = num.length() -1 ; i >=0; i--) {
 
             int temp = num.charAt(i);
              //把字符转换成数字   temp>=65代表是字母 大写字母A-55就是十六进制原数字 字符数字-‘0’得到十六进制原数字
             temp = temp >= 65 ? temp - 55 : temp - '0';
             //把数字temp%2取4次 如果temp为0刚好填充二进制
             for (int j = 0; j < 4; j++) {
                 result.append(temp % 2);
                 temp /= 2;
            }
        }
          //从后向前取
            JInZhi2_8(result.reverse());
    }
 
     /**
      * 二进制转八进制
      * @param num
      */
     public static void JInZhi2_8(StringBuffer num){
         StringBuffer result = new StringBuffer();
         //如果这个字符串的个数不够3的倍数就补零
         while (num.length()%3!=0){
             num.insert(0,'0');
        }
         // 0   3   6   9   12
         //每次i+3   给二进制数三个一组
         //i+1*4 + i + 2 * 2 + i + 3 * 1
         for (int i = 0 ; i < num.length();i += 3){
                 int temp01 = (num.charAt(i)-'0')*4;
                 int temp02 = (num.charAt(i+1)-'0')*2;
                 int temp03 = (num.charAt(i+2)-'0')*1;
              //添加到数组中
             result.append(temp01+temp02+temp03);
        }
         //如果数组的第一位是0就舍弃这个下标
         //有可能二进制数是 000 1,这样会导致八进制出现首位是0的情况
         if(result.charAt(0) == '0'){
             System.out.println(result.substring(1));
        }else{
             System.out.println(result);
        }
    }
 }

 

 

posted on   吃可乐的陈伽  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示