41、十六进制转化为十进制
写一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围: 1<=n<= 2^31-1
输入描述
输入一个十六进制的数值字符串
输出描述
输出该数值的十进制字符串
示例:
输入:
0xAA
输出:
170
思路
- 读取十六进制数,并将其转换成十进制存储,最后用 %x 输出该数的十进制表示即可
- 十六进制转十进制:从高位开始,每位乘以16的n-1次方,再相加,即可得出十进制数。(n为十六进制数的位数)
- 更多进制转化总结,可参考大神链接
具体实现
#include <iostream>
using namespace std;
int main() {
string s; //存放十六进制数
int ans; //保存转换后的十进制数
while (cin >> s) {
int ls = s.size();
ans = 0;
for (int i = 0; i < ls; i++) { //从第一个字符开始遍历(最右边的)
ans = ans * 16;
if (s[i] >= '0' && s[i] <= '9')
ans = ans + (s[i] - '0');
else //从10开始往后就为字母A~F
ans = ans + (s[i] - 'A') + 10;
}
cout << ans << endl;
}
return 0;
}
运行结果
复杂度
- 时间复杂度O(n) --- 其中n为字符串长度
- 空间复杂度O(1) --- 没有额外的辅助空间,常数级存储空间
其他实现方式
#include <stdio.h>
int main() {
int ret ;
scanf_s("%x", &ret);//%x是以十六进制形式输入
printf("%d", ret);
return 0;
}
//使用sscanf函数将以字符串形式的十六进制数转换为整形的十六进制
//sscanf与printf函数很像,都是以格式化的形式进行操作,、
//例如sscanf_s("A23CD", "%x", &a);
//%x是将字符串A23CD以十六进制形式输入a中,
//如果将%x换成%d的话,是将字符串A23CD以十进制形式输入a中,
//这是错误的,因为将A23CD转化为十进制,A,CD等字符无法解析,
#include <stdio.h>
int main()
{
int a,B;
sscanf_s("0xAA", "%x", &a);
printf("%x\n", a);
printf("%d\n", a);
return 0;
}