一個面試題,要求輸入十進制數,輸出十六進制,能夠使用printf打印%d,%c,%s來輸出,但不能使用 %x 打印。面試
寫了兩種算法,還算比較簡潔,粘貼在此。 算法
- // 第一種算法,從低位到高位掃描移位,須要一個數組輔助倒序,一次性輸出結果
- #include <stdio.h>
- #define MAX_HEX_NUM 16
- #define OUT_DATA_LEN sizeof(int)*2 // 2個16進制數表示1個字節
- static char Hex_Char_Table[MAX_HEX_NUM] = {
- '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
- };
- int ten2hex( int data )
- {
- char result[OUT_DATA_LEN+1];
- int i,index;
- result[OUT_DATA_LEN] = '\0';
- for( i=OUT_DATA_LEN-1; i>=0; i-- )
- {
- index = data & 0xf;
- result[i] = Hex_Char_Table[index];
- data = data>>4;
- }
- printf("0x%s\n",result);
- return 0;
- }
下面是第二種算法,從高位向低位掃描,獲得結果直接打印。數組
- #include <stdio.h>
- #define BITS_OF_INT sizeof(int)*8 // int的位數
- #define OUT_DATA_LEN sizeof(int)*2 // 2個16進制數表示1個字節
- int printHex( int num )
- {
- int i;
- printf("0x");
- for(i=0;i<OUT_DATA_LEN;i++)
- {
- unsigned int res = num & 0xf0000000; //注意,必須用 unsigned int來接收,不然當輸入負數的時候會轉換錯誤
- res = res >> (BITS_OF_INT-4);
- char c;
- if( res <= 9 )
- c = res + '0';
- else
- c = 'A' + res - 10;
- printf("%c",c);
- num = num << 4;
- }
- printf("\n");
- }
兩種算法其實都是採用移位的方式來運算,而不是採用除法,這樣會更加高效一些,我想這個題目的考點應該也在這裏吧。ide