蓝桥杯: 基础练习 十六进制转八进制

蓝桥杯: 基础练习 十六进制转八进制

问题

问题描述
  给定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;
}
原文地址:https://www.cnblogs.com/swordgrass/p/13899326.html