JAVA实现10进制的数转化为任意n进制的数

来源:互联网 发布:像堆糖一样的软件 编辑:程序博客网 时间:2024/05/20 12:23

我们仔细想想,要实现10进制数转化为任意n进制的数,其实是可以用栈来实现的。

根据计算机的进制转换知识我们知道,10进制数num转化为n进制(比如n=2),我们就是先进行num % n 操作,余数不断的除以2,直到余数为零。然后把商按照从下到上的顺序排列。(具体怎么算大家都会)。我要说的是这个商可以用栈保存起来。根据栈的先进后出原则,我们就可以把这个二进制数打印出来。

需要进行的步骤是:

1、自己实现栈的功能。(当然可以用现成的库函数,但自己练习写一下也不错)

2、写个进制转化的函数实现数制之间的转换。

现在我们就一步步来做。


先实现栈

定义接口:

package com.guobing.stack;@SuppressWarnings("hiding")public interface Stack_Interface<Object> {public void initStack();       //这个方法貌似可以不要,后面再看看public void push(Object obj);  //向栈顶插入一个元素public boolean isEmpty();      //判断是否为空public Object peek();          //返回栈顶元素的值public Object pop();           //从栈中删除栈顶元素并返回public void clear();           //清除栈中的所有元素使之成为一个空栈public void print();           //打印栈中的元素}
实现接口

package com.guobing.stack;/** * @topic 栈的链表实现 * @author guobbing * @version 1.1 * @since 12:33 */public class LinkedStack implements Stack_Interface{public Node top;                                     //定义栈顶指针/** * 清除栈中的元素,使之成为空栈 */@Overridepublic void clear() {                                   top = null;}/** * 初始化栈 */@Overridepublic void initStack() {top = null;}/** * 判断栈是否为空  */@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn top == null;}/** * 得到栈顶元素并返回 */@Overridepublic Object peek() {                                  if(top == null) {System.out.println("栈为空");return null;}System.out.println("当前栈顶元素的值为:" + top.element);return top.element;}/** * 删除栈顶元素并返回 */@Overridepublic Object pop() {                                  if(top == null) {System.out.println("空指针");return null;                                  //当栈顶元素为空时,返回空指针} else {Node p = top;                                 //定义一个p来保存栈顶指针//System.out.println(top.element);top = top.next;                               //指向下一个,原来栈顶的引用丢失,等待被回收内存return p.element;}                                  }/** * 打印栈中的元素 */@Overridepublic void print() {Node p = top;while(p != null) {System.out.println(p.element);p = p.next;}}@Overridepublic void push(Object obj) {top = new Node(obj, top);}//测试public static void main(String [] args) {LinkedStack ls = new LinkedStack();ls.initStack();ls.push("a");ls.push("b");ls.push("c");ls.push("d");ls.push("e");ls.push("f");ls.peek();                                        //得到栈顶元素System.out.println("当前栈中元素为:");ls.print();                                       //打印栈中的元素System.out.println("删除栈顶元素后:");if(!ls.isEmpty()) {ls.pop();                                     //删除栈顶元素ls.peek();ls.print();}System.out.println("清空栈之后:");ls.clear();                                       //清空栈ls.peek();}}/** * 定义每个链表块 * @author guob * */class Node {Object element;Node next;public Node(Node nt) {                                //两种构造方法next = nt;}public Node(Object obj, Node nt) {                    //相当于在头结点处插入数据element = obj;next = nt;}}


现在我们写好栈了,开始写转换函数

package com.guobing.stack;/** * 功能:把一个十进制的数转化为n进制的数 * @author guobing * date:2014/09/02 */public class Transform {/** * @param num 表示十进制的数 * @param n   表示要转化为n进制 */public Transform(long num, int n) {LinkedStack ls = new LinkedStack();  //初始化栈long p = num;                        //这里创建p变量是有原因的  num的值会变while(num != 0) {int k = (int)(num % n);ls.push(k);num /= n;}System.out.println("10进制数" + p + "转化为" + n + "进制数的结果是:");while(!ls.isEmpty()) {System.out.print(ls.pop() + " ");if(ls.top.next == null) {System.out.println(ls.pop());}}}public static void main(String [] args) {new Transform(234323, 16);new Transform(4344,2);new Transform(4344,8);new Transform(4344,10);}}

测试结果如下:

10进制数234323转化为16进制数的结果是:3 9 3 5 310进制数4344转化为2进制数的结果是:1 0 0 0 0 1 1 1 1 1 0 0 010进制数4344转化为8进制数的结果是:1 0 3 7 010进制数4344转化为10进制数的结果是:4 3 4 4

现在终于写完了,如果有问题,欢迎指教,欢迎讨论。



0 0