Day09 2023/01/16
难度:简单
题目
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 数据范围:保证结果在 1 ≤ n ≤ 2^31−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例
输入:0xAA
输出:170
思路一
因为任意进制转换成10进制,只需要将任意进制数从低位到高位,把对应的数码和权值相乘,然后累加就可以得到结果。如图所示:
思路二
使用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;
}
- 时间复杂度 --- 遍历字符串,n为字符串长度
- 空间复杂度 --- 无辅助空间
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;
}
- 时间复杂度
- 空间复杂度 --- 无辅助空间
总结
- 一定要熟练掌握进制转换这种基本功。