給出一個非負整數,將它表示成十六進制的形式。
1 /* 2 十六進制數是在程序設計時經常要使用到的一種整數的表示方式。 3 它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號 4 分別表示十進制數的0至15。十六進制的計數方法是滿16進1 5 所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。 6 給出一個非負整數,將它表示成十六進制的形式。 7 輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647 8 */ 9 #include<iostream> 10 using namespace std; 11 12 char exchange_int_char(int a) //整型轉換為字符型 13 { 14 char b; 15 switch (a) 16 { 17 case 0:b = '0'; break; 18 case 1:b = '1'; break; 19 case 2:b = '2'; break; 20 case 3:b = '3'; break; 21 case 4:b = '4'; break; 22 case 5:b = '5'; break; 23 case 6:b = '6'; break; 24 case 7:b = '7'; break; 25 case 8:b = '8'; break; 26 case 9:b = '9'; break; 27 case 10:b = 'A'; break; 28 case 11:b = 'B'; break; 29 case 12:b = 'C'; break; 30 case 13:b = 'D'; break; 31 case 14:b = 'E'; break; 32 case 15:b = 'F'; break; 33 default:break; 34 } 35 return b; 36 } 37 38 int main(void) 39 { 40 int n,m; 41 int i = 0; 42 cin >> n; 43 char* arr = new char[9]; //2147483647轉換成16進制是7FFFFFFF,所以最高有8位,再加上最后一位'\0',所以最大要9位 44 if (n > 15) 45 { 46 while (n >= 16) 47 { 48 m = n % 16; //m保存余數 49 n = n / 16; 50 arr[i] = exchange_int_char(m); 51 i++; 52 } 53 arr[i] = exchange_int_char(n); 54 for (int j = i; j >= 0; j--) //倒着輸出 55 { 56 cout << arr[j]; 57 } 58 } 59 else 60 { 61 arr[i] = exchange_int_char(n); 62 cout << arr[i]; 63 } 64 return 0; 65 }
注意:(1):為了節省內存,首先根據可能輸入的整型最大值算出所需要的最大的數組空間,也就是位數最多的時候為8位,所以給數組分配9位
(2):注意這里為什么要倒着輸出。根據10進制轉換16進制的機制,首先得到的余數要放在數組的最后一位,然而這里把首先得到的余數放在了數組的第一位
(3):注意53行,這里有個坑,我自己一開始沒發現。為什么是arr[i]而不是arr[i+1]。因為第51行有個i++,本來這個i++是為了控制數組往后移動一位,然而在循環結束的時候,數組里面沒有存 入任何數,仍然向后移動一位。如果我們在53行再去i+1的話,就相當於比原來多加了2,也就是說下一個元素是arr[i+2]而不是我們所想的arr[i+1],這個時候arr[i+1]沒有初始化,所以在最 后結果輸出的時候會輸出亂碼。
然后再分享一個在網上看到的更簡單的方法:
參考原鏈接:https://blog.csdn.net/qq_38961856/article/details/79244387?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158389331719725256757324%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158389331719725256757324&biz_id=0&utm_source=distribute.pc_search_result.none-task
1 #include<iostream> 2 3 #include<string> 4 5 using namespace std; 6 7 int main() 8 9 { 10 11 long a;//輸入的數 12 13 int y=0;//循環中的余數 14 15 string s="";//輸出的結果 16 17 cin>>a; 18 19 if(a==0)//0比較特殊,單獨處理 20 21 { 22 23 cout<<0; 24 25 return 0; 26 27 } 28 29 30 31 while(a>0)//大於0的數 32 33 { 34 35 y=a%16; //求余 36 37 if(y<10) //小於10的余數 38 39 s=char('0'+y)+s; //利用字符的ascll碼在字符串前面拼接 40 41 else 42 43 s=char('A'-10+y)+s; //大於9的余數用ABCDE表示 44 45 a=a/16; 46 47 } 48 49 cout<<s; 50 51 return 0; 52 53 }