⽤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小时内删除。
发表评论