题解 | #进制转换#
进制转换
http://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6
题目分析
- 题目给出一组十六进制的数字
- 我们要输出对应的十进制数字
方法一:库函数
- 实现思路
-
int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
-
c++中使用
stoi
函数支持直接转换,将str字符串从pos的位置开始,以base进制转换成int类型
-
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s;
while(cin >> s) {
cout << stoi(s, 0, 16) << endl; // 直接调用库函数解决
}
}
复杂度分析
- 时间复杂度:,线性的复杂度转换,其中n表示输入字符串的长度
- 空间复杂度:,只需要常量级别的空间大小
方法二:遍历
- 实现思路
-
对字符串的每一位进行遍历
-
区分数字部分和字母部分
-
数字部分直接转换为int类型,并每轮累计16倍乘关系
-
字母部分要注意转换成10-15之间的数字,并每轮累计16倍乘关系
-
输出最后的数字
-
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
string s;
while(cin >> s) {
int n = 0;
for(int i = 2; i < s.size(); i++) { // 遍历十六进制字符串
n *= 16; // 每轮在前一轮的基础上*16
if(s[i] >= '0' && s[i] <= '9') { // 判断如果要处理数字
n += (s[i] - '0');
}
else {
n += (s[i] - 'A' + 10); // 判断如果要处理字母
}
}
cout << n << endl;
}
return 0;
}
复杂度分析
- 时间复杂度:,线性的复杂度转换,其中n表示输入字符串的长度
- 空间复杂度:,只需要常量级别的空间大小