Java算法學習:java進制轉換(十進制轉八進制,十進制轉二進制,十六進制轉八進制)

java進制轉換(十進制轉八進制,十進制轉二進制,十六進制轉八進制)

這幾天在複習C語言的數據結構棧和隊列那一章的時候,看到利用棧的特性FILO實現的進制轉換十分簡潔

想起了java中實現棧的操作十分方便(不用自己寫.h文件,內部util.Stack包已經封裝好)

所以用這個來寫一個進制轉換作爲記錄

十進制怎麼轉化爲二進制呢?

    public void Dex2Bin(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%2;
            stack.push(x);
            n/=2;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }

首先是獲取被轉換的數據n,創建一個棧,new即可,自動初始化(對應C語言中的top指針指向base)

當n>0的時候,不斷的:

  • 除以2取餘 x=n%2,取餘的數字壓棧
  • 數字除以2取整 n/=2

這樣就完成了對一個數字進制轉換的過程。

輸出的時候只要對stack不斷的pop即可

同理十進制轉八進制也是如此

    public void Dex2Oct(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%8;
            stack.push(x);
            n/=8;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }

和二進制轉換類似,不多贅述

十六進制怎麼轉化爲八進制呢?

    public void Hex2Oct(String n) {
        int hex2dex = 0;
        int reIndex = 0;
        /*十六進制轉十進制*/
        for (int i = n.length()-1; i >= 0; i--) {
            if(Character.isDigit(n.charAt(i))&&
                    Integer.parseInt(String.valueOf(n.charAt(i))) >= 0 &&
                    Integer.parseInt(String.valueOf(n.charAt(i))) <= 9){
                    hex2dex += Integer.parseInt(String.valueOf(n.charAt(i))) * Math.pow(16, reIndex);
            } else {
                switch (n.charAt(i)) {
                    case 'A':
                        hex2dex += 10 * Math.pow(16, reIndex);
                        break;
                    case 'B':
                        hex2dex += 11 * Math.pow(16, reIndex);
                        break;
                    case 'C':
                        hex2dex += 12 * Math.pow(16, reIndex);
                        break;
                    case 'D':
                        hex2dex += 13 * Math.pow(16, reIndex);
                        break;
                    case 'E':
                        hex2dex += 14 * Math.pow(16, reIndex);
                        break;
                    case 'F':
                        hex2dex += 15 * Math.pow(16, reIndex);
                        break;
                }
            }
            reIndex++;
        }
        //十進制轉八進制
        Dex2Oct(hex2dex);

    }

這裏說實話,我個人覺得寫得很囉嗦,希望能提出改進意見,主要是在char轉換位int的時候有些麻煩

上面的算法分爲兩個部分:1、十六進制字符串轉換爲對應的十進制,完成了從字符串到數字的轉換

                                       2、十進制轉換爲八進制

首先是逐個解析十六進制字符串,採用倒序循環的方式。

同時設置一個從0開始遞增的輔助變量reIndex,幫助算法完成對最後一個字符的乘以16的N次方的行爲。

解析的時候,首先判斷這個字符串是不是一個數字型比如‘9’:

  • 若是,對這個字符轉換爲數字9之後,乘以相應的16的N次方;
  • 若不是,對這個數字單獨辨識,必定是ABCDEF其中一個,在對這些數字表示的十進制數值進行運算操作。

得到十六進制轉換的十進制數字之後,對這個數字進行上面已經完成的十進制轉八進制的運算,只要傳入數字即可獲得答案。

總結

  1. 算法特點,利用棧的特點解決進制轉換很方便
  2. 轉換出來的二進制沒有前綴00...

 

貼完整代碼:

樣例輸入:先輸入十進制轉換二進制的十進制數字:比如15

轉換完成之後輸入一個16進制字符,轉換爲8進制

import java.util.Scanner;
import java.util.Stack;
/**
 * Page Description:
 * User: Yelihu
 * Date: 2018-12-19
 * Time: 上午 9:16
 * Function:
 */
public class Main {
    public void Dex2Bin(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%2;
            stack.push(x);
            n/=2;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }
    public void Dex2Oct(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%8;
            stack.push(x);
            n/=8;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }
    public void Hex2Oct(String n) {
        int hex2dex = 0;
        int reIndex = 0;
        /*十六進制轉十進制*/
        for (int i = n.length()-1; i >= 0; i--) {
            if(Character.isDigit(n.charAt(i))&&
                    Integer.parseInt(String.valueOf(n.charAt(i))) >= 0 &&
                    Integer.parseInt(String.valueOf(n.charAt(i))) <= 9){
                    hex2dex += Integer.parseInt(String.valueOf(n.charAt(i))) * Math.pow(16, reIndex);
            } else {
                switch (n.charAt(i)) {
                    case 'A':
                        hex2dex += 10 * Math.pow(16, reIndex);
                        break;
                    case 'B':
                        hex2dex += 11 * Math.pow(16, reIndex);
                        break;
                    case 'C':
                        hex2dex += 12 * Math.pow(16, reIndex);
                        break;
                    case 'D':
                        hex2dex += 13 * Math.pow(16, reIndex);
                        break;
                    case 'E':
                        hex2dex += 14 * Math.pow(16, reIndex);
                        break;
                    case 'F':
                        hex2dex += 15 * Math.pow(16, reIndex);
                        break;
                }
            }
            reIndex++;
        }
        //十進制轉八進制
        Dex2Oct(hex2dex);

    }
    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        //十進制轉二進制
        main.Dex2Bin(n);
        Scanner sc1 = new Scanner(System.in);
        String str1 = sc1.nextLine();
        //十六進制轉八進制
        main.Hex2Oct(str1);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章