返回 课程
信奥AC之路-3级
0% 完成
0/0 步骤
-
第一课:数组基础4 主题|小节
-
第二课:数组基础二6 主题|小节
-
第三课:数组基础三6 主题|小节
-
第四课:数组基础四7 主题|小节
-
第五课:数组基础五5 主题|小节
-
第六课:数组用于统计,去重,排序5 主题|小节
-
第七课:冒泡排序6 主题|小节
-
第八课:数组连续性元素6 主题|小节
-
第九课:数组综合一7 主题|小节
-
第十课:字符数组7 主题|小节
-
第十一课:字符数组基础应用5 主题|小节
-
第十二课:字符数组基础应用二6 主题|小节
-
第十三课:字符数组进阶6 主题|小节
-
第十四课:字符串进阶二6 主题|小节
-
第十五课:字符串(STL)9 主题|小节
-
第十六课:字符串基础6 主题|小节
-
第十七课:字符串函数6 主题|小节
-
第十八课:字符串函数二4 主题|小节
-
第十九课:sort函数7 主题|小节
-
第二十课:字符串进阶7 主题|小节
-
第二十一课:字符串进阶二6 主题|小节
-
第二十二课:进制转换--十进制转其他进制5 主题|小节
-
第二十三课:进制转换--其他进制转十进制5 主题|小节
-
第二十四课:二进制,八进制,十六进制转换5 主题|小节
-
第二十五课:数据编码基础6 主题|小节
-
第二十六课:位运算基础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;
}
算法解析:
- 通过判断第二个字符是否为字母来区分进制类型
- 如果是字母(’x’),则为十六进制
- 否则为八进制
- 十六进制从索引2开始处理(跳过”0x”)
- 八进制从索引1开始处理(跳过开头的”0″)
- 注意题目中十六进制使用小写字母,所以用
'a'
而不是'A'
- 使用循环处理多组数据