问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF样例输出
65535
分析
十六进制转十进制,主要就是转换公式:res +=k*16^(n-1-i)(k为当前位,n是长度,i是当前位数)。
代码
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
string dec="";
string hex="";
string inpu;
int i;
int k;
long long result;
while(cin>>inpu){
hex="";
for(i=0;i<inpu.length();i++){
switch(inpu[i]){
case 'F':k=15;break;
case 'E':k=14;break;
case 'D':k=13;break;
case 'C':k=12;break;
case 'B':k=11;break;
case 'A':k=10;break;
default :k=inpu[i]-'0';
}
result +=k*(pow(16,inpu.length()-1-i));
}
cout<<result-1<<endl;//转为long long格式后会出现计算多1的问题,可能是整数溢出计算了。需要剪除。
}
return 0;
}
如果计算量大的话,result就要采用long long 数据才行,然后就会出现0->1的问题,也就是会自动在后面+1导致运算出错。哎。猜测是计算时整数溢出的可能,有空会验证下。