在上一篇博文中我們實現(xiàn)了后進先出的數(shù)據(jù)結(jié)構(gòu)——棧(Stack)。它后進先出的特性,使他成為程序設(shè)計中的有用工具。
在這篇博文中,我們將利用上一篇博文中實現(xiàn)的MyArrayStack去完成一個進制轉(zhuǎn)換的任務(wù)。
任務(wù)目標(biāo):
給予一個非負十進制數(shù)N,要求轉(zhuǎn)換成的2進制數(shù)。
算法原理:
假設(shè)二進制數(shù)N需要轉(zhuǎn)換為d進制數(shù),其算術(shù)原理為:
N = (N / d) * d + N%d
我們要將非負10進制數(shù)轉(zhuǎn)換為2進制數(shù),就是將該數(shù)用短除法除以2,取得每一位的余數(shù),將余數(shù)按順序壓入棧中則輸出的數(shù)就是需要轉(zhuǎn)換的數(shù)。
如: 10進制數(shù)19需要轉(zhuǎn)換成為2進制數(shù)
| N | N/2 | N%2 |
|---|---|---|
| 19 | 9 | 1 |
| 9 | 4 | 1 |
| 4 | 2 | 0 |
| 2 | 1 | 0 |
| 1 | 0 | 1 |
所以二進制數(shù)就是將余數(shù)從高位到低位輸出,即10011
10011 = 1* 2^4+0+0+1 *2^1 +1 = 16 +2 +1 = 19
因此算法十分簡單,只需要將低位到高位的余數(shù)壓入棧中,再從棧頂依次彈出數(shù)字即是需要轉(zhuǎn)換的進制數(shù)了。
代碼實現(xiàn)如下:
public class DecToBinaryTest { //建立類變量stack用來存儲余數(shù) static MyArrayStack<Integer> stack; public static void main(String[] args) { // TODO Auto-generated method stub stack = new MyArrayStack<Integer>(); System.out.PRintln(getBinaryForm(19)); } private static String getBinaryForm(int decNum){ //如果輸入的10進制數(shù)為負數(shù)則拋出異常 if(decNum<0) throw new IllegalArgumentException(); StringBuffer sb = new StringBuffer(); while(decNum !=0){ //當(dāng)decNum不為0時,迭代地除2的余數(shù)壓入棧中 Integer r = decNum % 2; decNum = decNum /2; stack.push(r); } //將棧中的元素彈出并放入到字符串中輸出 while(!stack.isEmpty()) sb.append(stack.pop()); return sb.toString(); }}本博文源碼下載地址,內(nèi)含MyArrayStack源碼及進制轉(zhuǎn)換源碼,歡迎下載測試。
新聞熱點
疑難解答