蓝桥水题_ 基础练习 十六进制转八进制

题目本身不难理解,但是如果输入的是每个十六进制数长度不超过100000

就要用特殊的办法了


一开始想用16转10,然后10转8的老套路,结果运行错误还是超时


然后看题目的锦囊,发现要用二进制,但是用STL中的容器写完之后运行超时了。。。。。。。

看了网上的解答,发现自己思路没错,但是STL的速度实在太慢,尤其是大到10万级别


顺便其实在转换16进制到2进制字符串中,觉得switch-case暴力直接加真的太蠢萌了,于是想用自己之前的方法


			//cache_mids作为每个16位转成2进制的中间变量字符串,防止每4位的顺序颠倒
			string cache_mids;
			int num = trans16To10(s[i]);
			while(num > 0 ) {
				char cache =  '0'+num%2;
				//	mids+= ;
				cache_mids =cache + cache_mids;
				num /=2;
			}

			//补0
			if(cache_mids.size()%4!=0) {
				int cache_num = 4-mids.size()%4;
				for(int j = 0 ; j < cache_num; ++j ) {
					cache_mids = "0" + cache_mids;
				}
			}

			mids = mids+cache_mids;

但是很不幸,加上之后就超时了,改成蠢萌的switch-case加字符串之后就通过了


下面贴上通过代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <stack>
#include <list>
using namespace std;

int trans16To10(char num) {
	if(num>='A' && num <='F') {
		return num-'A'+10;
	} else {
		return num-'0';
	}
}

int main() {
	int n = 0;
	cin>>n;

	while(n--) {
		//s保存输入的数据,mids保存转换成二进制的字符串
		string s,mids;
		cin>>s;

		for(int i = 0; i <s.size(); ++i) {
			//将每一个16进制数转成4位二进制字符串

			switch(s[i]) {
				case '0':
					mids+="0000";
					break;
				case '1':
					mids+="0001";
					break;
				case '2':
					mids+="0010";
					break;
				case '3':
					mids+="0011";
					break;
				case '4':
					mids+="0100";
					break;
				case '5':
					mids+="0101";
					break;
				case '6':
					mids+="0110";
					break;
				case '7':
					mids+="0111";
					break;
				case '8':
					mids+="1000";
					break;
				case '9':
					mids+="1001";
					break;
				case 'A':
					mids+="1010";
					break;
				case 'B':
					mids+="1011";
					break;
				case 'C':
					mids+="1100";
					break;
				case 'D':
					mids+="1101";
					break;
				case 'E':
					mids+="1110";
					break;
				case 'F':
					mids+="1111";
					break;

			}

			//			//cache_mids作为每个16位转成2进制的中间变量字符串,防止每4位的顺序颠倒
//			string cache_mids;
//			int num = trans16To10(s[i]);
//			while(num > 0 ) {
//				char cache =  '0'+num%2;
//				//	mids+= ;
//				cache_mids =cache + cache_mids;
//				num /=2;
//			}
//
//			//补0
//			if(cache_mids.size()%4!=0) {
//				int cache_num = 4-mids.size()%4;
//				for(int j = 0 ; j < cache_num; ++j ) {
//					cache_mids = "0" + cache_mids;
//				}
//			}
//
//			mids = mids+cache_mids;

		}


		int lenth = mids.size();
//补0
		if(mids.size()%3!=0) {
			int cache_num = 3-mids.size()%3;
			for(int j = 0 ; j < cache_num; ++j ) {
				mids = "0" + mids;
			}

		}


		bool isNo1 = false; //防止出现补0
		for(int i = 0; i <mids.size();  ) {
			int num = (mids[i++]-'0')*4+(mids[i++]-'0')*2+(mids[i++]-'0');
			if(num) {
				isNo1 = true;
			}
			if(isNo1) {
				cout<<num;
			}
		}
		cout<<endl;
	}
	return 0;
}


			//cache_mids作为每个16位转成2进制的中间变量字符串,防止每4位的顺序颠倒
			string cache_mids;
			int num = trans16To10(s[i]);
			while(num > 0 ) {
				char cache =  '0'+num%2;
				//	mids+= ;
				cache_mids =cache + cache_mids;
				num /=2;
			}

			//补0
			if(cache_mids.size()%4!=0) {
				int cache_num = 4-mids.size()%4;
				for(int j = 0 ; j < cache_num; ++j ) {
					cache_mids = "0" + cache_mids;
				}
			}

			mids = mids+cache_mids;



原题:

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值