1. 程式人生 > >JAVA實現10進位制的數轉化為任意n進位制的數

JAVA實現10進位制的數轉化為任意n進位制的數

我們仔細想想,要實現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

現在終於寫完了,如果有問題,歡迎指教,歡迎討論。