算法初级_Question10_整数进制转换问题(java实现,栈和递归实现)

这篇文章讲述的是算法初级部分的整数进制转换问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。

问题描述

给定一个M进制的数x,实现对x向任意进制的数的转换。

算法分析

进制转换的基本思想是对进制M取余,再逆向输出余数,过程如下例:

将10进制的8转换成2进制
第一步: 8%2 = 0 , 8/2 = 4
第二步: 4%2 = 0 , 4/2 = 2
第三步: 2%2 = 0 , 2/2 = 1
第五步: 1%2 = 1 , 1/2 = 0
第六步:逆序输出余数:1 0 0 0 即为8的2进制表示

考虑要求的特性,先进后出,需要借助栈这个数据结构来完成。

代码实现

public class Q10_NumberConvert {
    /**
     * 问题分析:给定一个M进制的数x,实现对x向任意进制的数的转换。
     * 
     * 算法分析:进制转换的基本思想是对进制M取余,再逆向输出余数,过程如下例:
     *                         将10进制的8转换成2进制
     *           第一步: 8%2 = 0 , 8/2 = 4
     *           第二步: 4%2 = 0 , 4/2 = 2
     *           第三步: 2%2 = 0 , 2/2 = 1
     *           第五步: 1%2 = 1 , 1/2 = 0
     *           第六步:逆序输出余数:1 0 0 0 即为8的2进制表示       
     * 
     *                         考虑要求的特性,先进后出,需要借助栈这个数据结构来完成。
     */
    public static void main(String[] args) {
        final int N = 16 ;              //输出数据的进制
        final int number = 1000 ;
        Stack stack = new Stack() ;    //初始化一个栈
        stack.init();
        int n = number ;
        while(n > 0){
            switch(n % N){
                case 10: stack.push('A');break;
                case 11: stack.push('B');break;
                case 12: stack.push('C');break;
                case 13: stack.push('D');break;
                case 14: stack.push('E');break;
                case 15: stack.push('F');break;

                default:{
                    stack.push(n%N);
                }
            }
            n /= N ;
        }
        System.out.print("整数 "+number+" 的  "+N+" 进制转换后的结果为:");
        while(stack.size()>0){
            System.out.print(stack.pop()+" ");
        }
    }
}
/*链栈的java实现*/
class Stack{

    /*定义两个指针目的是分别指向栈底和栈顶*/
    private Element base ;
    private Element top ;

    /*栈中的数据模型*/
    class Element{
        public Object data ;                     //栈中元素
        Element next ;                           //下一个元素
    }

    /*初始化*/
    public void init(){
        Element elem = new Element() ;           //开辟一个元素的空间作为栈底
        base = elem ;                            //top指针和base指针初始化
        top =  elem ;
        base.data = null ;
        //System.out.println("栈已初始化");
    }

    /*压栈操作*/
    public void push(Object obj){
        Element elem = new Element() ;           // 入栈元素分配空间
        elem.data = obj ;                        // 将元素放入
        elem.next = top ;                        // 元素指针指向当前top所指元素
        top = elem ;                             // 修改top指针
        //System.out.println(top.data+" 压栈成功");
    }

    /*退栈操作*/
    public Object pop(){
        if(this.isEmpty()){
            System.out.println("退栈失败,栈为空!");
            return null ;
        }
        Object obj = top.data ;                   //取出对象的值
        top = top.next ;                          //修改top指针
        //System.out.println(obj+" 退栈成功");
        return obj ;                              //返回元素
    }

    /*判断栈是否为空*/
    public boolean isEmpty(){
        if(base == top)                           //若栈顶栈底指针相同,则为空否则非空
            return true ;
        else
            return false ;
    }

    /*清空栈*/
    public void clear(){
        while(!this.isEmpty()){
            this.pop() ;
        }
        System.out.println("栈已清空");
    }

    /*获取栈的大小*/
    public int size(){
        int n = 0 ;
        Element flag = top ;
        while(flag!=base){
            flag = flag.next ;
            n++ ;
        }
        return n ;
    }

    /*遍历栈,输出栈的元素*/
    public void print(){
        if(this.isEmpty()){                        //若栈空
            System.out.println("输出失败,栈为空!");
        }else{
            Element flag = top ;
            System.out.print("栈中元素为:");
            while(flag != base){
                System.out.print(flag.data+" ");
                flag = flag.next ;
            }
        }
    }
}

递归方法实现

/*递归法实现*/
    public static void sort(int num , int format){
        if(num == 0){
            return ;
        }else{
            sort(num/format , format) ;
            switch( num%format ){
                case 10 : System.out.print('A'+" ");break ;
                case 11 : System.out.print('B'+" ");break ;
                case 12 : System.out.print('C'+" ");break ;
                case 13 : System.out.print('D'+" ");break ;
                case 14 : System.out.print('E'+" ");break ;
                case 15 : System.out.print('F'+" ");break ;

                default:{
                    System.out.print(num%format+" ");
                }
            }
        }
    }

样例输出

整数 100016 进制转换后的结果为:3 E 8 

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80814150