题解 | #进制转换#

进制转换

http://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6

题目的主要信息:

  • 将输入的十六进制数(字符串)转化成十进制的数字输出
  • 可能同时输入多个测试字符串

方法一:遍历转换

具体做法:

对于每个输入的字符串,我们从后往前遍历,因为字符串前两位是0x,对数字没有意义,所有遍历时要去掉这两位。

遍历到每个字符时,我们将其利用ASCII转化成十进制的数——字符为数字的减去字符零即可,字符为字母的减去字符A还要加10,然后利用进制转化的操作,每一位的数乘上对应的16的次方数相加即可:

alt

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

int main(){
    string s; 
    while(cin >> s){ //连续读取字符串
        int bit = 0; //记录当前位数
        int res = 0;
        for(int i = s.length() - 1; i > 1; i--){
            if(s[i] >= '0' && s[i] <= '9'){
                res += (s[i] - '0') * pow(16, bit); //当前数字乘16的位数次方
                bit++;
            }
            else if(s[i] >= 'A' && s[i] <= 'F'){
                res += (s[i] - 'A' + 10) * pow(16, bit); //字母要转化成数字
                bit++;
            }
        }
        cout << res << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n)nnn为字符串长度,遍历字符串所有的字符串
  • 空间复杂度:O(1)O(1)O(1),无额外空间使用

方法二:流输入输出的格式化

具体做法:

cin和cout有自己的格式化操作,在输入输出前加hex,表示后续这个是十六进制的数,在输入输出前加dec,表示后续这个是十进制的数,我们可以利用这个原理让输出的变成十六进制数,输出成十进制数。

#include<iostream>
using namespace std;

int main(){
    int res = 0;
    while(cin >> hex >> res)  //hex表示读入十六进制数
        cout << dec << res << endl; //dec表示输出十进制数
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1)O(1),无额外时间
  • 空间复杂度:O(1)O(1)O(1),无额外空间
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论

相关推荐

12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
88
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务