⽤C++实现:将10进制转换为16进制
问题描述
  ⼗六进制数是在程序设计时经常要使⽤到的⼀种整数的表⽰⽅式。它有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>
10using namespace std;
11
12char exchange_int_char(int a)      //整型转换为字符型
13 {
14char b;
15switch (a)
16    {
17case0:b = '0'; break;
18case1:b = '1'; break;
19case2:b = '2'; break;
20case3:b = '3'; break;
21case4:b = '4'; break;
22case5:b = '5'; break;
23case6:b = '6'; break;
24case7:b = '7'; break;
25case8:b = '8'; break;
26case9:b = '9'; break;
27case10:b = 'A'; break;
28case11:b = 'B'; break;
29case12:b = 'C'; break;
30case13:b = 'D'; break;
31case14:b = 'E'; break;
32case15:b = 'F'; break;
33default:break;
34    }
35return b;
36 }
37
38int main(void)
39 {
40int n,m;
41int i = 0;
42    cin >> n;
43char* arr = new char[9];  //2147483647转换成16进制是7FFFFFFF,所以最⾼有8位,再加上最后⼀位'\0',所以最⼤要9位
44if (n > 15)
45    {
46while (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);
54for (int j = i; j >= 0; j--)          //倒着输出
55        {
56            cout << arr[j];
57        }
58    }
59else
60    {
61        arr[i] = exchange_int_char(n);
62        cout << arr[i];
63    }
64return0;
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]没有初始化,所以在最后结果输出的时候会输出乱码。
然后再分享⼀个在⽹上看到的更简单的⽅法:
参考原链接:blog.csdn/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_so task
1 #include<iostream>
2
3 #include<string>
4
5using namespace std;
6
7int main()
8
9 {
10
11long a;//输⼊的数
12
13int y=0;//循环中的余数
14
15string s="";//输出的结果
16
17    cin>>a;
18
19if(a==0)//0⽐较特殊,单独处理
20
21    {
22
23    cout<<0;
24
25return0;
26
27    }
28
29
16进制字符串转16进制数组30
31while(a>0)//⼤于0的数
32
33    {
34
35        y=a%16;  //求余
36
37if(y<10)  //⼩于10的余数
38
39        s=char('0'+y)+s;  //利⽤字符的ascll码在字符串前⾯拼接40
41else
42
43        s=char('A'-10+y)+s;  //⼤于9的余数⽤ABCDE表⽰
44
45        a=a/16;
46
47    }
48
49    cout<<s;
50
51return0;
52
53 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。