返回 课程

信奥AC之路-3级

0% 完成
0/0 步骤
  1. 第一课:数组基础
    4 主题|小节
  2. 第二课:数组基础二
    6 主题|小节
  3. 第三课:数组基础三
    6 主题|小节
  4. 第四课:数组基础四
    7 主题|小节
  5. 第五课:数组基础五
    5 主题|小节
  6. 第六课:数组用于统计,去重,排序
    5 主题|小节
  7. 第七课:冒泡排序
    6 主题|小节
  8. 第八课:数组连续性元素
    6 主题|小节
  9. 第九课:数组综合一
    7 主题|小节
  10. 第十课:字符数组
    7 主题|小节
  11. 第十一课:字符数组基础应用
    5 主题|小节
  12. 第十二课:字符数组基础应用二
    6 主题|小节
  13. 第十三课:字符数组进阶
    6 主题|小节
  14. 第十四课:字符串进阶二
    6 主题|小节
  15. 第十五课:字符串(STL)
    9 主题|小节
  16. 第十六课:字符串基础
    6 主题|小节
  17. 第十七课:字符串函数
    6 主题|小节
  18. 第十八课:字符串函数二
    4 主题|小节
  19. 第十九课:sort函数
    7 主题|小节
  20. 第二十课:字符串进阶
    7 主题|小节
  21. 第二十一课:字符串进阶二
    6 主题|小节
  22. 第二十二课:进制转换--十进制转其他进制
    5 主题|小节
  23. 第二十三课:进制转换--其他进制转十进制
    5 主题|小节
  24. 第二十四课:二进制,八进制,十六进制转换
    5 主题|小节
  25. 第二十五课:数据编码基础
    6 主题|小节
  26. 第二十六课:位运算基础
    6 主题|小节
课 进展
0% 完成

“在实际编程中,我们经常需要处理多种进制的混合输入,”我解释道,”通常通过前缀来识别不同的进制:’0x’表示十六进制,’0’开头表示八进制。”

23.4.1 8进制、16进制转10进制

题目描述: 这个问题非常简单,就是将八进制和十六进制转换成十进制。

输入格式: 第一行输入一个整数 N(0≤N≤200000),表示有 N 组数据。 接下来有 N 行,每行都是一个字符串 S (且 S 的长度不小于 1 ,不超过 11 ),如果字符串是以” 0x “(零 x )开头的则表示是十六进制,如果以” 0 “(零)开头,则表示是八进制。数据保证字符串 S 中只有数字和小写字母且合法,转换后的十进制数在 int 范围内。(注意:8 进制和 16 进制可能存在前导 0,比如:0x01a 、0016)

输出格式: 对于每行输入数据,输出一行。

样例输入

3
0x1
00
011

样例输出

1
0
9

代码实现

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;                // 数据组数
    string s;             // 存储每组输入
    cin >> n;
    
    while(n--){           // 处理n组数据
        cin >> s;
        int m = 0;        // 存储转换结果
        
        if(isalpha(s[1])){    // 如果第二个字符是字母,说明是0x开头的十六进制
            // 从第3个字符开始处理(跳过0x)
            for(int i = 2; i < s.size(); i++){
                if(isdigit(s[i]))                     // 处理数字
                    m = m * 16 + (s[i] - '0');
                else                                  // 处理字母(注意是小写)
                    m = m * 16 + (s[i] + 10 - 'a');  // 题目说是小写字母
            }
        }else{                // 否则是0开头的八进制
            // 从第2个字符开始处理(跳过开头的0)
            for(int i = 1; i < s.size(); i++){
                m = m * 8 + (s[i] - '0');
            }
        }
        
        cout << m << endl;    // 输出结果并换行
    }
    
    return 0;
}

算法解析

  1. 通过判断第二个字符是否为字母来区分进制类型
    • 如果是字母(’x’),则为十六进制
    • 否则为八进制
  2. 十六进制从索引2开始处理(跳过”0x”)
  3. 八进制从索引1开始处理(跳过开头的”0″)
  4. 注意题目中十六进制使用小写字母,所以用'a'而不是'A'
  5. 使用循环处理多组数据