题目的主要信息:

  • 将输入的十六进制数(字符串)转化成十进制的数字输出
  • 可能同时输入多个测试字符串

方法一:遍历转换

具体做法:

对于每个输入的字符串,我们从后往前遍历,因为字符串前两位是0x,对数字没有意义,所有遍历时要去掉这两位。

遍历到每个字符时,我们将其利用ASCII转化成十进制的数——字符为数字的减去字符零即可,字符为字母的减去字符A还要加10,然后利用进制转化的操作,每一位的数乘上对应的16的次方数相加即可:

alt

#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)O(n)O(n)nnn为字符串长度,遍历字符串所有的字符串
  • 空间复杂度:O(1)O(1)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)O(1),无额外时间
  • 空间复杂度:O(1)O(1)O(1),无额外空间