蓝桥杯试题集 基础练习 十六进制转八进制(BASIC-12)

问题描述

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入

2
39
123ABC

样例输出

71
4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。


感觉这道题已经不能算是一道简单的基础练习了,吐槽ㄟ( ▔, ▔ )ㄏ

解决方案

/*****************************
* effect:进制转换HexToOct
* author:wyrctzy
* environment:Visual Studio 2019
* time:2019/02/13 07:16
*****************************/
// hextoOctalFormat.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <string>
using namespace std;
void HextoOct(string& s);
int main()
{
	int N;//N组数据需要转换进制
	string s;
	cin >> N;
	while (N--) {
		cin >> s;//数据举例:AB 1010 1011  253
		//十六进制转八进制
		HextoOct(s);
	}
	return 0;
}


void HextoOct(string& s) {
	string bs = "";
	int modNum = 0;//字符串长度对3取余的结果

	//因为题目给出的字符串首部是不含0的,因此从首尾开始都是一样的
	//一开始从末尾开始转换,导致字符串连接消耗的时间过多,导致一直超时
	for (int i = 0; i < s.size(); i++) {
		switch (s[i]) {
		case '0': bs += "0000"; break;
		case '1': bs += "0001"; break;
		case '2': bs += "0010"; break;
		case '3': bs += "0011"; break;
		case '4': bs += "0100"; break;
		case '5': bs += "0101"; break;
		case '6': bs += "0110"; break;
		case '7': bs += "0111"; break;
		case '8': bs += "1000"; break;
		case '9': bs += "1001"; break;
		case 'A': bs += "1010"; break;
		case 'B': bs += "1011"; break;
		case 'C': bs += "1100"; break;
		case 'D': bs += "1101"; break;
		case 'E': bs += "1110"; break;
		case 'F': bs += "1111"; break;
		default:break;
		}
	}
	//给字符串前面加入省略的0 循环减少导致超时的原因
	modNum = bs.length() % 3;
	if (modNum == 1)
		bs = "00" + bs;
	else if (modNum == 2)
		bs = "0" + bs;
	/*消耗时间过多
	while (addNum--) {
		bs = "0" + bs;
	}*/
	string rst = "";//转换为Oct进制的字符串 但是此时开头的位置可能包含无意义的0
	for (int k = 0; k < bs.length(); k += 3) {
		int d = 4 * (bs[k] - '0') + 2 * (bs[k + 1] - '0') + (bs[k + 2] - '0');
		rst += (d + '0');
	}
	//从第一个不是0的数字开始输出,直到结束
	int notZero = 0;
	for (int i = 0; i < 3; ++i) {
		if (rst[i] != '0') {
			notZero = i;
			break;
		}
	}
	//如果只有一位数字,那么就直接输出它
	for (int i = notZero; i < rst.length(); ++i) {
		cout << rst[i];
	}
	cout << endl;
}

本来是没有太大问题的,但是在字符串处理方面时间出现很大的出入,导致了超时,问题主要纠结在

bs += "0000";

 bs = "0000" + bs;

处理时的时间差距,就是这里直接导致Time Out。一定一定要需要引起足够的重视,暂时就酱( •̀ ω •́ )✧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值