问题描述

  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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 }