蓝桥杯: 基础练习 十六进制转八进制
问题
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
分析
100000长度的十六进制数,字符串很长,用数组切段做。
3位十六进制 = 12位二进制 = 4位八进制。
偷懒使用C++ string的字符截取函数substr(),截取3位十六进制数后,再偷懒使用sscanf转成十进制,最后偷懒使用printf直接输出八进制,输出注意开头前导零。
从前面截取开始的话,开头可能不足3位十六进制,用长度取模3,得到开头需要取得的长度,之后就都取3位。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int n=0;
scanf("%d",&n);
int num,pos,len;
char c[4];
string str;
for (int j = 0; j < n; ++j){
cin >> str;
len = str.length();
pos = len % 3;
if(pos){
strcpy(c,str.substr(0,pos).c_str());
sscanf(c,"%X",&num);
printf("%o", num);
}
for (int i = pos; i <= len-3; i+=3){
strcpy(c,str.substr(i,3).c_str());
sscanf(c,"%X",&num);
printf("%04o", num);
}
printf("
");
}
return 0;
}