#include<iostream>
#include<math.h>
#include<string>
#include<vector>
#include<algorithm>
#include<sstream>
#include<iterator>
using namespace std;
long long sixteenToTen(string str) //FE65CDBA
{
long long sum = 0;//结果 4268084666超出int范围
int len = str.length();//长度 8
for (int i = 0; i < len; i++)
{
char r = str[i];//提取第一个字符 F
int ans = 0;//将字符转成数字
if (r >= 'A' && r <= 'F')
{
switch (r)
{
case 'A':
ans = 10;
break;
case 'B':
ans = 11;
break;
case 'C':
ans = 12;
break;
case 'D':
ans = 13;
break;
case 'E':
ans = 14;
break;
case 'F':
ans = 15;
break;
default:
break;
}
}
else
{
ans = (int)r - 48;
}
long long end = ans * pow(16.0, len - i - 1);//每位数转成十进制的结果
sum += end;
}
return sum;
}
int main()
{
string s;//接收第一行(有几个要转换的字符串)
getline(cin, s);
cout<<sixteenToTen(s);
system("pause");
return 0;
}
代码优化(一)
因为cin的缓冲区能保存数据,并以空格位截断点,利用for循环能够依次将缓冲区的数据读入
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main(){
string Hex;
int len;
long long sum = 0;
getline(cin,Hex);
len = Hex.length();
int count = len - 1;
//将十六进制转换为十进制
for(int i=0;i<len;i++){
char ch = Hex.at(i);
if(ch >= 'A' && ch <= 'F'){
//将字母转换为数字
sum += (ch-'A'+10)*pow(16,count);
}else{
sum += (ch-'0')*pow(16,count);
}
count--;
}
cout<<sum;
return 0;
}
代码优化(二)
利用c语言自带的%x(无符号以十六进制表示的整数 )和%d( 十进制有符号整数 ),其中ll代表long long型。
#include<cstdio>
int main()
{
long long int n;
scanf("%llX", &n);
printf("%lld",n);
return 0;
}
参考文献
[1]代码优化(一):https://blog.csdn.net/qq_41575507/article/details/105714770
[2]代码优化(二):https://blog.csdn.net/VayLiu/article/details/112973239