作者 : 卿笃軍
將一個十進制數轉化為任意進制數(2~16進制之間)~
C語言版:
#includeC++版,優化了一下程序,精簡了一些代碼~~~//n:原數(10進制) to:將轉換成的進制 buf:保存轉換後的進制數 void fn(int n, int to, char *buf) { //將i定義為靜態的目的:為了在多層遞歸裡面使用的是同一個i值 static int i = 0; //特殊情況0,獨立出來處理 if (n == 0) { buf[i] = '0'; return; } //對於負數的預處理 if (n < 0) { buf[i] = '-'; ++i; n = -n; } //正整數遞歸,進行進制轉換. if (n != 0) { //遞歸入棧 fn(n/to,to,buf); //遞歸彈棧 switch(n%to) { case 15: buf[i] = 'F'; break; case 14: buf[i] = 'E'; break; case 13: buf[i] = 'D'; break; case 12: buf[i] = 'C'; break; case 11: buf[i] = 'B'; break; case 10: buf[i] = 'A'; break; default: buf[i] = (n%to+'0'); break; } ++i; } } int main() { char buf[50] = ""; int n, to; scanf("%d%d",&n,&to); //進制轉換 fn(n,to,buf); puts(buf); return 0; }
原來我一直以為static 定義數據類型的時候,右值必須是一個const值,當然,我當初在C環境下測試的時候也是這樣的。
示例:
1)static int a = 0; √
2)static int a = (1 == 2)? 1 : 3; ×
不過,今天看到同學寫第二種形式,竟然也是對的。後來問了一下,原來是.cpp後綴。
遞歸的時候,將一些執行語句放入static 裡面,由於static語句只執行一次,在裡面放入一些,只需要執行一次的語句再好不過了~~~~
下面代碼,請在.cpp 文件下面執行,.c會報錯~~~
#include當然,上述代碼,沒有對超過16進制和小於2進制的時候進行處理~~~~//n:原數(10進制) to:將轉換成的進制 char *fn(int n, int to) { //定義靜態變量的目的:為了在多層遞歸裡面使用的是同一個值,且static只執行一次 static char buf[100] = "", BinHex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //進行n == 0 和 n < 0 的情況處理,static只執行一次 static int i = (n >= 0) ? (buf[0] = '0',0) : (buf[0] = '-',n = -n,1); //正整數遞歸,進行進制轉換. if (n != 0) { //遞歸入棧 fn(n/to,to); //遞歸彈棧 buf[i++] = BinHex[n%to]; } return buf; } int main() { char *buf = NULL; int n, to; //輸入n:原數據 to:需要轉化成的進制 scanf("%d%d",&n,&to); //進制轉換 buf = fn(n,to); puts(buf); return 0; }
參考文獻:SnailSet的博客專欄,將十進制整數轉換成b進制字符串 (遞歸和非遞歸實現),http://blog.csdn.net/snailset/article/details/26492715