[编程题]进制转换

来源:互联网 发布:oracle linux安装教程 编辑:程序博客网 时间:2024/05/17 02:42

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(十进制)来告诉输入输出流对象控制格式。

0 0
原创粉丝点击