题目的主要信息:
- 将输入的十六进制数(字符串)转化成十进制的数字输出
- 可能同时输入多个测试字符串
方法一:遍历转换
具体做法:
对于每个输入的字符串,我们从后往前遍历,因为字符串前两位是0x,对数字没有意义,所有遍历时要去掉这两位。
遍历到每个字符时,我们将其利用ASCII转化成十进制的数——字符为数字的减去字符零即可,字符为字母的减去字符A还要加10,然后利用进制转化的操作,每一位的数乘上对应的16的次方数相加即可:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main(){
string s;
while(cin >> s){ //连续读取字符串
int bit = 0; //记录当前位数
int res = 0;
for(int i = s.length() - 1; i > 1; i--){
if(s[i] >= '0' && s[i] <= '9'){
res += (s[i] - '0') * pow(16, bit); //当前数字乘16的位数次方
bit++;
}
else if(s[i] >= 'A' && s[i] <= 'F'){
res += (s[i] - 'A' + 10) * pow(16, bit); //字母要转化成数字
bit++;
}
}
cout << res << endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:O(n),n为字符串长度,遍历字符串所有的字符串
- 空间复杂度:O(1),无额外空间使用
方法二:流输入输出的格式化
具体做法:
cin和cout有自己的格式化操作,在输入输出前加hex,表示后续这个是十六进制的数,在输入输出前加dec,表示后续这个是十进制的数,我们可以利用这个原理让输出的变成十六进制数,输出成十进制数。
#include<iostream>
using namespace std;
int main(){
int res = 0;
while(cin >> hex >> res) //hex表示读入十六进制数
cout << dec << res << endl; //dec表示输出十进制数
return 0;
}
复杂度分析:
- 时间复杂度:O(1),无额外时间
- 空间复杂度:O(1),无额外空间