JAVA實現10進位制的數轉化為任意n進位制的數
阿新 • • 發佈:2018-12-30
我們仔細想想,要實現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
現在終於寫完了,如果有問題,歡迎指教,歡迎討論。