Talk is cheap, show me the code.
一、问题描述
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
输入例子:
0xA
输出例子:
10
二、问题分析
主要难度在于输入的是十六进制字符串,如何将字符串转换成整型数值。
解题方式1:
#include <iostream>
#include <string>
#include <map>
#include <cmath>
using namespace std;
int main()
{
map<char, int> map1;
map1['A'] = 10;
map1['B'] = 11;
map1['C'] = 12;
map1['D'] = 13;
map1['E'] = 14;
map1['F'] = 15;
string s;
while (cin >> s)
{
int sum = 0;
for (int i = 2; i < s.size(); i++)
{
if (s[i] <= '9')
{
sum += (s[i] - '0') * pow(16, (s.size() - 1 -i));
} else {
sum += map1[s[i]] * pow(16, (s.size() - 1 - i));
}
}
cout << sum << endl;
}
return 0;
}
这里其实可以避免使用map,可以直接用 s[i] - ‘A’ + 10 来表示大于9的十六进制数。
时间复杂度是字符串长度。空间复杂度是字符串长度。
解题方式二:
其实C++提供了非常优雅的方式来处理不同进制数的输入输出,即std:hex, std:oct, std:dec等。
#include <iostream>
#include <string>
using namespace std;
int a;
while (cin >> hex >> a)
{
cout << a << endl;
}
return 0;
}
即每次输入输出不同进制数通过先输入输出std::hex(十六进制),std::oct(八进制),std::dec(十进制)来告诉输入输出流对象控制格式。