进制转换 | 正解及分析
题目大意
给定一个十六进制下的字符串,请将它转换成一个十进制的数字。
思路
对于每一位字符,考虑他的十进制值,并累计到答案的末位之后。
具体实现方式可以为res=(res<<4)+...;
,用了一些位运算。
分析
如果一个数字为小写字母ch,它对应的十进制值为ch-'a'+10
;
如果一个数字为大写字母ch,它对应的十进制值为ch-'A'+10
;
如果一个数字为数字字母ch,它对应的十进制值为ch-'0'
。
正解
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;//较高精度的浮点数
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
int C2I (char ch)
{//将char类型转化为相对应的int类型,简写为C2I
if ('A'<=ch&&ch<='F')
return ch-'A'+10;//大写
else if ('a'<=ch&&ch<='f')
return ch-'a'+10;//小写
else
return ch-'0';//数字
}
int convert (string x)
{//将十六进制字符串x转化为十进制数字
int l=0,r=x.size()-1;
int res=0,sign=1;
//l,r表示目前的左右端点
//res表示目前答案,sign表示答案要乘以的倍率
if (x[0]=='-')
sign=-1,l=3;//有符号,从“第四个”字符开始
else
l=2;//无符号,从“第三个”字符开始
while(l<=r)
{
res=(res<<4)+C2I(x[l]);//考虑当前位对应的十进制值
++l;;//记得往右边扩张
}
return sign*res;
}
int main ()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
string x;
while(cin>>x)
cout<<convert(x)<<endl;
return 0;
}
作者:陆修远
链接:https://www.acwing.com/activity/content/code/content/3980288/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时空消耗
时间:20ms。
空间:220KB。
最后分析
方法能简洁一点就简洁一点,不要太装X然后写错了(非常尴尬,不是吗)。时间上的浪费也是一种警告。