不用循环的算法可以寻求递归来实现。
对于这个最大整数转为二进制时递归最深,64位64倍固定栈大小?。
itoa将num按radix进制转换字符串到rec_array缓冲区,其中缓冲区未检测。
- #include"stdio.h"
- #include"string.h"
- int trace_counter = 0;
- char *trace_array;
- char *rec_itoa(int num, char *rec_array, int radix);
- char *itoa(int num, char *array, int radix)
- {
- char *rec_array = array;
- trace_array = array; // trace
- if (num < 0)
- {
- num = -num;
- *array = '-';
- rec_array++;
- trace_counter++; // trace
- }
- else if (num == 0)
- *array = 0 - '0';
- rec_array = rec_itoa(num, rec_array, radix);
- *rec_array = 0;
- return array;
- }
- char *rec_itoa(int num, char *rec_array, int radix)
- {
- static char array_0_z[] = "0123456789abcdefghijklmnopqrstuvwxyz";
- printf("trace num : %d. \n", num);
- if (num >= radix)
- {
- rec_array = rec_itoa(num / radix, rec_array, radix);
- num %= radix;
- }
- *rec_array = array_0_z[num];
- 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;
- trace_counter++; // trace
- return ++rec_array;
- }
- // 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>
- // function.
- char *rec(char *buf, int len)
- {
- if (len)
- buf = rec(buf, len - 1);
- printf("rec %s\n", buf++);
- return buf;
- }
- void rec_to_change_buf_is_na(char *buf, int len)
- {
- // codes here are the same to the above but the last line;
- }
- int main()
- {
- char buf[100] = "++++++++";
- printf("result: %s\n", itoa(244, buf, 2));
- char rec_buf[] = "201308021926";
- rec(rec_buf, strlen(rec_buf));
- //char * p= "abcde";
- //int a = (++p)++;
- //printf("a = %d\n", a);
- int *p[6], (*p2)[4];
- int arr[6][4];
- printf("\narr = %p, arr[0] = %p\n", arr,arr[0]);
- p[0] = arr[0];
- p2 = arr;
- p2++;
- printf("p = %p, p2 = %p\n\n%d\n",p, p2, 2^3);
- }
- /*
- ouptput :
- trace num : 244.
- trace num : 122.
- trace num : 61.
- trace num : 30.
- trace num : 15.
- trace num : 7.
- trace num : 3.
- trace num : 1.
- trace_0: updata array[0] = 1, now array = '1+++++++'
- trace_1: updata array[1] = 1, now array = '11++++++'
- trace_2: updata array[2] = 1, now array = '111+++++'
- trace_3: updata array[3] = 1, now array = '1111++++'
- trace_4: updata array[4] = 0, now array = '11110+++'
- trace_5: updata array[5] = 1, now array = '111101++'
- trace_6: updata array[6] = 0, now
- array = '1111010+'
- trace_7: updata array[7] = 0, now array = '11110100'
- result: 11110100
- rec 201308021926
- rec 01308021926
- rec 1308021926
- rec 308021926
- rec 08021926
- rec 8021926
- rec 021926
- rec 21926
- rec 1926
- rec 926
- rec 26
- rec 6
- rec