Java进制转换简单实现代码

代码原理,里面用栈实现的

class Stack {
    int top = 0;
    int[] array = null;

    public Stack() {
        this(10);
    }

    public Stack(int size) {
        this.top = 0;
        this.array = new int[size];
    }

    public boolean isFull() {
        return (top == array.length);
    }

    public void put(int x) {
        if(isFull()) { //如果栈满了,就扩容
            this.array = Arrays.copyOf(array, array.length*2);
        }
        array[top] = x;
        top++;
    }

    /**
     * 因为2进制、8进制、10进制数每个数都不会大于10,所以如果输出大于10的数必为16进制数
     * 而在16进制数中,10~15依次用A B C D E F表示
     */
    public void show() {  
        for(int i = top-1;i >= 0;i--) {
            if(array[i] < 10) {
                System.out.print(array[i]);
            }else {
                if(array[i] == 10) {
                    System.out.print("A");
                }
                if(array[i] == 11) {
                    System.out.print("B");
                }
                if(array[i] == 12) {
                    System.out.print("C");
                }
                if(array[i] == 13) {
                    System.out.print("D");
                }
                if(array[i] == 14) {
                    System.out.print("E");
                }
                if(array[i] == 15) {
                    System.out.print("F");
                }
            }
        }
        System.out.println();
    }
}

public class TransitionNumber {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for(;;) {
        System.out.print("输入待转换的数的进制:  ");
        int x = sc.nextInt();
        if(x != 2 && x != 8 && x != 10 && x != 16) {
            System.out.println("进制不合法!,请重新输入");
            continue;
        }
        System.out.print("输入需要转换后的进制:  ");
        int y = sc.nextInt();
        if(y != 2 && y != 8 && y != 10 && y != 16) {
            System.out.println("进制不合法!,请重新输入");
            continue;
        }

        System.out.print("请输入需要转换的数:   ");
        int i = sc.nextInt();

        if(!judge(x,i)) {
            System.out.println("你输入的不是"+x+"进制数,"+x+"进制数每个数应该小于"+x);
            continue;
        }
        System.out.print(x+"进制数"+i+"转换为"+y+"进制数后为:  ");
        decimalTooctonary(y,octonaryTodecimal(x,i)).show();
        }
    }


    /**
     * 判断输入的进制数是否正确
     * @param x
     * @param i
     * @return
     */
    private static boolean judge(int x, int i) {
        String str = String.valueOf(i);  //基本数据类型转字符串
        char[] cha = str.toCharArray();  //字符串转换成字符数组
        if(x == 2) {
            for(int j = 0;j < cha.length;j++) {
                //字符数组里的每个元素转成int型参与比较
                if(Integer.parseInt(cha[j]+"") > 1) {  
                    return false;
                }
            }
        }

        if(x == 8) {
            for(int j = 0;j < cha.length;j++) {
                if(Integer.parseInt(cha[j]+"") > 7) {
                    return false;
                }
            }
        }

        if(x == 10) {
            for(int j = 0;j < cha.length;j++) {
                if(Integer.parseInt(cha[j]+"") > 9) {
                    return false;
                }
            }
        }

        if(x == 16) {
            for(int j = 0;j < cha.length;j++) {
                if(Integer.parseInt(cha[j]+"") > 15) {
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * 其他进制转十进制
     * @param x
     * @param i
     * @return
     */
    private static int octonaryTodecimal(int x,int i) {
        int n = i;
        int m = i;
        int num = 0;
        int b = (int) b(i);
        int a = (int) Math.pow(10, b);
        while(a >= 1) {
            n = m/a;
            m = m%a;
            a = a/10;
            num = n+num*x;
        }
        return num;

    }

    /**
     * 
     * @param i
     * @return
     */
    private static double b(int i) {
        int n = i;
        int b = 0;
        while(n/10 != 0) {
            n = n/10;
            b++;
        }
        return b;
    }

    /**
     * 十进制转其他进制
     * @param i
     * @return 
     */
    private static Stack decimalTooctonary(int y,int i) {
        Stack x = new Stack();
        int n = i;
        while(true) {
            if(n/y != 0) {
                x.put(n%y);
                n = n/y;
            }else {
                x.put(n);
                return x;
            }
        }
    }
}

运行结果:

输入待转换的数的进制:  16
输入需要转换后的进制:  8
请输入需要转换的数:   544
16进制数 【544】 转换为8进制数后为:  2504
输入待转换的数的进制:  8
输入需要转换后的进制:  2
请输入需要转换的数:   2504
8进制数 【2504】 转换为2进制数后为:  10101000100
输入待转换的数的进制:  8
输入需要转换后的进制:  10
请输入需要转换的数:   2504
8进制数 【2504】 转换为10进制数后为:  1348
输入待转换的数的进制:  8
输入需要转换后的进制:  16
请输入需要转换的数:   10700
8进制数 【10700】 转换为16进制数后为:  11C0
输入待转换的数的进制:  2
输入需要转换后的进制:  10
请输入需要转换的数:   2536
你输入的不是2进制数,2进制数每个数应该小于2
输入待转换的数的进制:  2
输入需要转换后的进制:  10
请输入需要转换的数:   10010
2进制数 【10010】 转换为10进制数后为:  18
输入待转换的数的进制:  2
输入需要转换后的进制:  8
请输入需要转换的数:   10010
2进制数 【10010】 转换为8进制数后为:  22
输入待转换的数的进制:  10
输入需要转换后的进制:  8
请输入需要转换的数:   18
10进制数 【18】 转换为8进制数后为:  22
输入待转换的数的进制:  

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/81947228