您的位置:首页 > 编程语言 > Java开发

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

2014-09-02 17:10 525 查看
我们仔细想想,要实现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; //定义栈顶指针

/**
* 清除栈中的元素,使之成为空栈
*/
@Override
public void clear() {
top = null;
}

/**
* 初始化栈
*/
@Override
public void initStack() {
top = null;
}

/**
* 判断栈是否为空
*/
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return top == null;
}

/**
* 得到栈顶元素并返回
*/
@Override
public Object peek() {
if(top == null) {
System.out.println("栈为空");
return null;
}
System.out.println("当前栈顶元素的值为:" + top.element);
return top.element;
}

/**
* 删除栈顶元素并返回
*/
@Override
public 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;
}
}

/**
* 打印栈中的元素
*/
@Override
public void print() {
Node p = top;
while(p != null) {
System.out.println(p.element);
p = p.next;
}
}

@Override
public 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 3
10进制数4344转化为2进制数的结果是:
1 0 0 0 0 1 1 1 1 1 0 0 0
10进制数4344转化为8进制数的结果是:
1 0 3 7 0
10进制数4344转化为10进制数的结果是:
4 3 4 4


现在终于写完了,如果有问题,欢迎指教,欢迎讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制