码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-22 18:41:52      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:一个   字符串   class   运用   scan   ret   数组   自带   string   

一开始这道题我是想着用系统自带的函数去做的,事实告诉我偷懒是别想偷懒的。
所以老老实实的回来想题目。这道题其实不是什么难题,主要是涉及到一些字符串格式的运用。大概的思路就是把16进制变为二进制,再把二进制变为八进制。
把十六进制转换为二进制:是通过将十六进制数逐一变成4位的二进制数,所以这里将输入的字符串变为字符数组。其中通过StringBuilder来定义二进制数,因为StringBuilder有append函数,可以一次将一个字符串加入到总字符串中。
把二进制转换为八进制:是通过将每3位二进制数转换为一个八进制数,所以这里是用字符串操作。利用String的subString操作,一次可以通过对一个短字符串进行判定。

以下源代码:

import java.util.*;
public class Main{
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    
    for (int i = 1; i <= n; i++) {
        String s16 = sc.next();
        char[] c16 = s16.toCharArray();
        StringBuilder s2 = toBinary(c16);
        String s8 = toOctal(s2);
        System.out.println(s8);
    }
}

public static StringBuilder toBinary(char[] c16) {
    StringBuilder s2 = new StringBuilder();
    for (int j = 0; j < c16.length; j++) {

        switch(c16[j]) {
            case '0':  
                s2.append("0000");
                break;
            case '1':
                s2.append("0001");
                break;
            case '2':
                s2.append("0010");
                break;
            case '3':
                s2.append("0011");
                break;
            case '4':
                s2.append("0100");
                break;
            case '5':
                s2.append("0101");
                break;
            case '6':
                s2.append("0110");
                break;
            case '7':
                s2.append("0111");
                break;
            case '8':
                s2.append("1000");
                break;
            case '9':
                s2.append("1001");
                break;
            case 'A':
                s2.append("1010");
                break;
            case 'B':
                s2.append("1011");
                break;
            case 'C':
                s2.append("1100");
                break;
            case 'D':
                s2.append("1101");
                break;
            case 'E':
                s2.append("1110");
                break;
            case 'F':
                s2.append("1111");
                break;
        }
    }
    return s2;
}

public static String toOctal(StringBuilder sb2) {
    String s2 = sb2.toString();
    StringBuilder sb8 = new StringBuilder();

    if (sb2.length() % 3 == 2) {
        s2 = sb2.insert(0, "0").toString();
    } else if (sb2.length() % 3 == 1) {
        sb2.insert(0, "0");
        sb2.insert(0, "0");
        s2 = sb2.toString();
    } 
    
    for (int i = 0; i < s2.length(); i += 3) {
        switch(s2.substring(i, i+3)) {
            case "000": sb8.append(0);break;
            case "001": sb8.append(1);break;
            case "010": sb8.append(2);break;
            case "011": sb8.append(3);break;
            case "100": sb8.append(4);break;
            case "101": sb8.append(5);break;
            case "110": sb8.append(6);break;
            case "111": sb8.append(7);break;
        }
    }

    if (sb8.toString().startsWith("0")) {
        return sb8.toString().substring(1, sb8.length());
    }

    return sb8.toString();
}

}
------------恢复内容结束------------

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

标签:一个   字符串   class   运用   scan   ret   数组   自带   string   

原文地址:https://www.cnblogs.com/Reton/p/12229110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!