目录
问题描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 1≤n≤2^31−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
解题分析
本道题是十六进制转换传成十进制,所以会出现“ABCDEF”等字符来表示数字,现在难点就是如何把字符转换成数字?
我们可以查看以下ASCII表
发现“A”的ASCII码为65,又因为A在十六进制中表示数字10,所以我们用字符'A'-15就能得到数字10啦。同理,其他字符也是如此。
接下来就是进制转换的问题了,‘十六进制’转‘十进制’就是把‘十六进制’数按权展开、相加即得十进制数。 (十六进制为Hexadecimal,简写为H)
所以我们要从字符串尾部获取字符,直到找到字符‘x’(0x是16进制表示方法所以不计入中长度内)。
我们可以用数组获取整个字符串并求取数组长度len,然后从字符串末尾向前访问,直到访问字符‘x’停止。在循环过程中,我们用pow函数计算16的幂次方,循环从数组下标[len-1]循环到[2],每次循环16的幂就+1。
(大家如果不知道进制转换的可以参考这篇:超详细进制转换详解)
代码实现
#include<stdio.h>
#include<math.h>
int main()
{
char str[100];
scanf("%s", str);
int len = strlen(str);
int sum = 0;
for (int i = len - 1; i > 1; i--)
{
int ret;
if (str[i] >= 65)
{
ret = str[i] - 55;
}
else {
ret = str[i] - 48;
}
sum += ret * pow(16, len - i - 1);
}
printf("%d", sum);
return 0;
}