初步實現無循環(則遞歸)將任意整數轉任意進制字符串

不用循環的算法可以尋求遞歸來實現。

對於這個最大整數轉爲二進制時遞歸最深,64位64倍固定棧大小?。

itoa將num按radix進制轉換字符串到rec_array緩衝區,其中緩衝區未檢測。

  1. #include"stdio.h"  
  2. #include"string.h"  
  3.   
  4. int trace_counter = 0;  
  5. char *trace_array;  
  6. char *rec_itoa(int num, char *rec_array, int radix);  
  7.   
  8. char *itoa(int num, char *array, int radix)  
  9. {  
  10.     char *rec_array = array;  
  11.     trace_array = array;        // trace  
  12.     if (num < 0)  
  13.     {  
  14.         num = -num;  
  15.         *array = '-';  
  16.         rec_array++;  
  17.         trace_counter++;        // trace  
  18.     }  
  19.     else if (num == 0)  
  20.         *array = 0 - '0';  
  21.     rec_array = rec_itoa(num, rec_array, radix);  
  22.     *rec_array = 0;  
  23.     return array;  
  24. }  
  25.   
  26. char *rec_itoa(int num, char *rec_array, int radix)  
  27. {  
  28.     static char array_0_z[] = "0123456789abcdefghijklmnopqrstuvwxyz";  
  29.     printf("trace num : %d. \n", num);  
  30.     if (num >= radix)  
  31.     {  
  32.         rec_array = rec_itoa(num / radix, rec_array, radix);  
  33.         num %= radix;  
  34.     }  
  35.   
  36.     *rec_array = array_0_z[num];  
  37.   
  38.     printf("trace_%d: updata array[%d] = %c, now array = '%*s'\n", trace_counter, rec_array - trace_array, *rec_array, trace_counter + 1, trace_array);    // trace;  
  39.   
  40.     trace_counter++;            // trace  
  41.     return ++rec_array;  
  42. }  
  43.   
  44. // return buf+1 to change the pointer buf instead of moving it in a recursive <span style="font-family: Arial, Helvetica, sans-serif;">char *rec(char **buf, int len); will change buf.</span>  
  45. // function.  
  46. char *rec(char *buf, int len)  
  47. {  
  48.     if (len)  
  49.         buf = rec(buf, len - 1);  
  50.     printf("rec %s\n", buf++);  
  51.     return buf;  
  52. }  
  53.   
  54. void rec_to_change_buf_is_na(char *buf, int len)  
  55. {  
  56.     // codes here are the same to the above but the last line;  
  57. }  
  58.   
  59. int main()  
  60. {  
  61.     char buf[100] = "++++++++";  
  62.     printf("result: %s\n", itoa(244, buf, 2));  
  63.     char rec_buf[] = "201308021926";  
  64.     rec(rec_buf, strlen(rec_buf));  
  65.       
  66.     //char * p= "abcde";  
  67.      //int a = (++p)++;  
  68.      //printf("a = %d\n", a);  
  69.        
  70.      int *p[6], (*p2)[4];  
  71.      int arr[6][4];  
  72.      printf("\narr = %p,  arr[0] = %p\n", arr,arr[0]);  
  73.      p[0] = arr[0];  
  74.      p2 = arr;  
  75.      p2++;  
  76.      printf("p = %p,  p2 = %p\n\n%d\n",p, p2, 2^3);  
  77.        
  78.        
  79. }  
  80.   
  81.   
  82. /*   
  83.    ouptput :    
  84.    trace num : 244.  
  85.    trace num : 122.   
  86.    trace num : 61.   
  87.    trace num : 30.   
  88.    trace num : 15.   
  89.    trace num : 7.  
  90.    trace num : 3.   
  91.    trace num : 1.   
  92.    trace_0: updata array[0] = 1, now array = '1+++++++'   
  93.    trace_1: updata array[1] = 1, now array = '11++++++'  
  94.    trace_2: updata array[2] = 1, now array = '111+++++'  
  95.    trace_3: updata array[3] = 1, now array = '1111++++'  
  96.    trace_4: updata array[4] = 0, now array = '11110+++'   
  97.    trace_5: updata array[5] = 1, now array = '111101++'      
  98.    trace_6: updata array[6] = 0, now  
  99.    array = '1111010+'  
  100.    trace_7: updata array[7] = 0, now array = '11110100'  
  101.    result: 11110100   
  102.    rec 201308021926   
  103.    rec 01308021926   
  104.    rec 1308021926   
  105.    rec 308021926   
  106.    rec 08021926   
  107.    rec 8021926   
  108.    rec 021926   
  109.    rec 21926   
  110.    rec 1926   
  111.    rec 926  
  112.    rec 26   
  113.    rec 6   
  114.    rec  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章