资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
参考代码及详细说明
/**
十六进制转十进制
基本思路:先将十六进制数转换为二进制数,然后再将二进制数转换为十进制数
具体实施:用字符串来当作需要处理的数
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char sixteen[10];
char two[10000] = "";
int i;
scanf("%s", sixteen);
// 十六进制转二进制
for( i=0; i < strlen(sixteen); i++ ) {
switch( sixteen[i] ){
case '0': strcat(two, "0000"); break;
case '1': strcat(two, "0001"); break;
case '2': strcat(two, "0010"); break;
case '3': strcat(two, "0011"); break;
case '4': strcat(two, "0100"); break;
case '5': strcat(two, "0101"); break;
case '6': strcat(two, "0110"); break;
case '7': strcat(two, "0111"); break;
case '8': strcat(two, "1000"); break;
case '9': strcat(two, "1001"); break;
case 'a':
case 'A': strcat(two, "1010"); break;
case 'b':
case 'B': strcat(two, "1011"); break;
case 'c':
case 'C': strcat(two, "1100"); break;
case 'd':
case 'D': strcat(two, "1101"); break;
case 'e':
case 'E': strcat(two, "1110"); break;
case 'f':
case 'F': strcat(two, "1111"); break;
}
}
// 二进制转转十进制
int ids = strlen(two); // 获取二进制字符串长度
const int num = ids; // 用于循环遍历的常量
// 这里sum不能选用int类型,因为测试超过整型范围,因此我们选用double类型
double sum = 0;
int j;
for( j=0; j < num; j++ ) {
if( two[ids-1] != '0' ){
sum += pow(2, j);
}
ids--;
}
printf("%.0f", sum);
return 0;
}