问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
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]没有初始化,所以在最 后结果输出的时候会输出乱码。
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 }