HJ5 进制转换

176 阅读2分钟

Day09 2023/01/16

题目链接

难度:简单

题目

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 数据范围:保证结果在 1 ≤ n ≤ 2^31−1 

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例

输入:0xAA
输出:170

思路一


因为任意进制转换成10进制,只需要将任意进制数从低位到高位,把对应的数码和权值相乘,然后累加就可以得到结果。如图所示:

19D531BC581C4CE21CC1459DF882CAA8.gif

思路二


使用c++中的函数stoi实现进制转换

关键点


  • 思路一中对字符串中的数字和大写字母分别处理,数字可以直接相乘,但是字母需要先转成16进制所表示的数字,例如:'B'在16进制中表示数字11,我们可以通过'B' - 'A' + 10 = 12来实现。

  • 思路二中:stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制,其中stoi函数包含在 string 头文件中。

算法实现


c++代码实现1-遍历转换

#include<iostream>
#include<string>
#include <cmath>
using namespace std;

//方法一
int main () {
    cout << "请输入16进制字符串:";
    string str;
    cin >> str;

    int sum = 0; //各个位数码*位权累加结果
    int dig = 0; //记录当前所处位数

    //从后往前遍历进行累加(最左边两位0x不需要遍历)
    for (int i = str.size(); i > 1; i--) {
        if (str[i] >= '0' && str[i] <= '9') { //若字符位数字
            sum += int(str[i]) * pow(16, dig); //数码*位权累加
            dig++;
        }else if(str[i] >= 'A' && str[i] <= 'F') {
            sum += int(str[i] - 'A' + 10) * pow(16, dig); //其中A在16进制中为10,pow函数用来计算次幂的
            dig++;
        }
    }
    cout << "转换为10进制为:" << sum <<endl;
    return 0;
}
  • 时间复杂度 O(n)O(n) --- 遍历字符串,n为字符串长度
  • 空间复杂度 O(1)O(1) --- 无辅助空间

c++代码实现2-stoi函数

#include<iostream>
#include<string>
#include <cmath>
using namespace std;

//方法二:使用stoi库函数  
int main(){
    cout << "请输入16进制字符串:";
    string str;
    cin >> str;
    
    cout << "转换为10进制为:" << stoi(str, 0, 16) << endl;
    return 0;
}
  • 时间复杂度 O(1)O(1)
  • 空间复杂度 O(1)O(1) --- 无辅助空间

总结

  • 一定要熟练掌握进制转换这种基本功。