资源限制
时间限制:1.0s 内存限制:512.0MB
———————————————————————————————————————————
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
———————————————————————————————————————————
样例输入
FFFF
———————————————————————————————————————————
样例输出
65535
十六进制转换成十进制,总体思路就是依次对每一个字符进行处理,加到一起就可以了。问题就在于需要知道每一个字符对应十六进制的哪一位。
这些工作都做完了,细心的朋友会发现,有些样例无法通过,关键就在题目标红的部分,不超过八位十六进制,如果用来存储答案的是int类型的话,输入样例FFFFFFFF,答案是错误的,因为FFFFFFFF对应的十进制数是4294967295大于了int的范围,所以以答案所需要使用的数据类型是长整数类型。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
{
long long i,c = 1,sum = 0,tmp;
for(i = 1; s[i] != '\0'; i++)//计算总共有几位十六进制数;
{
c *= 16;
}
for(int j = 0; s[j] != '\0'; j++)//从最高位开始计算;
{
switch(s[j])
{
case '0':
break;
case '1':
sum += c;
break;
case '2':
tmp = 2*c;
sum += tmp;
break;
case'3':
tmp = 3*c;
sum += tmp;
break;
case'4':
tmp = 4*c;
sum += tmp;
break;
case'5':
tmp = 5*c;
sum += tmp;
break;
case'6':
tmp = 6*c;
sum += tmp;
break;
case'7':
tmp = 7*c;
sum += tmp;
break;
case'8':
tmp = 8*c;
sum += tmp;
break;
case'9':
tmp = 9*c;
sum += tmp;
break;
case'A':
tmp = 10*c;
sum += tmp;
break;
case'B':
tmp = 11*c;
sum += tmp;
break;
case'C':
tmp = 12*c;
sum += tmp;
break;
case'D':
tmp = 13*c;
sum += tmp;
break;
case'E':
tmp = 14*c;
sum += tmp;
break;
case'F':
tmp = 15*c;
sum += tmp;
break;
default:
break;
}
c = c/16;//计算完成后,向后移动一位;
}
cout << sum << endl;
}
return 0;
}