用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> 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 }

 


__EOF__

本文作者神楽桜KaguraSakura
本文链接https://www.cnblogs.com/KaguraSakura/p/12461869.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神楽桜KaguraSakura  阅读(12881)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示