代碼功能僅限在62進位以下
概要:
主要是類比手工運算。每一輪把運算得到商移入下一輪的除數,把得到的餘數儲存在輸出的數組裡。直到除數剩下一個數且小於要置換的進位數。
關鍵區段:
1,把indata的字元數群組轉換成inda整型數組,再加以計算。
2,每一輪求得的商前n位有可能出現0,則要過濾.
3,輸出進位數,應從後向前輸出
相關代碼如下:
#define MAX 500<br />char indata[MAX],outdata[MAX];//輸入輸出的轉換數<br />int inbase,outbase;//進位數儲存<br />int inda[MAX];//操作的轉換數<br />int mymap[MAX];//將字元轉為ASCII碼<br />char rmap[MAX];//ASCII碼轉字元<br />int mod;//餘數大小<br />int size_in,lsh= 0,i,t;<br />int modata[2*MAX], sh[MAX];//餘數和商<br />void turn()<br />{<br /> //記錄轉換數值<br /> for( int i = 'A'; i <= 'Z'; ++i)<br />{<br />mymap[i] = i-'A'+10;<br />rmap[i-'A'+10] = i;<br />}<br />for( int i = 'a'; i <= 'z'; ++i)<br />{<br />mymap[i] = i - 'a'+36;<br />rmap[i-'a'+36] = i;<br />}<br />for( int i = '0'; i <= '9'; ++i)<br />{<br />mymap[i] = i-'0';<br />rmap[i-'0'] = i;<br />}<br /> mod = 0;<br />size_in = strlen( indata );<br /> //字元數群組轉換為int型<br />for( int j = 0; j < size_in; ++j)<br />{<br />inda[j] = mymap[indata[j]];<br />}<br /> //每一輪迴圈<br />while( true )<br />{<br /> //終止條件<br />if( size_in == 1 && inda[0] < outbase )<br />{<br />modata[ mod++] = inda[0];<br />break;<br />}<br /> //求商<br />for( i = 0; i < size_in-1; ++i)<br />{<br />sh[lsh++] = inda[i] / outbase;<br />t = inda[i] % outbase;<br />inda[i+1] += t*inbase;//把除數除得的每一位移乘以原進位數移入下一位中<br />}<br />sh[lsh++] = inda[i] /outbase;<br />//求餘<br /> modata[mod++] = inda[i] % outbase;<br />//商去0<br /> for( i = 0; i < lsh; ++i)<br />{<br />if( sh[i] )<br />break;<br />}<br />int j ;<br /> //商移入除數<br />for( j = 0; i < lsh; ++i,++j)<br />{<br />inda[j] = sh[i];<br />}<br />size_in = j;<br />lsh = 0;<br />}<br /> //最後結果移入輸出數組<br />for( i = 0; i < mod; ++i)<br />{<br />outdata[i] = rmap[modata[i]];<br />}<br />}<br />
PS:看書時發現二進位和二叉樹有極相似的一點,位元換十進位是每一位按如下公式進行。
比如有n 位元
total = a[0]*2^(n-1) + a[1]*2^(n-2) + ..... + a[n-2]*2^(1) + a[n-1]*1;
而滿二叉樹每一層的節點數也有相似之處.
第0層節點數:2^0
第1層節點數: 2^1
第N層節點數: 2^N
很有意思,不過就是不知道哪裡可以運用上。
待交流。