BASIC-12 十六进制转八进制

  • 模拟,十六进制->二进制->(去前导0)八进制
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e5+9;
const double PI=acos(-1);
#define line '\n'
#define gt getchar()
#define mid ((L+R)>>1)
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
string get(int x)
{
	string str="";
	while(x)str=char(x%2+'0')+str,x/=2;
	while(str.length()<4)str="0"+str;
	return str;
}
map<char,string> mp;
char s[N];
int a[3];
int main()
{	
	for(int i=0;i<=15;++i)if(i<=9)mp[i+'0']=get(i);else mp[i-10+'A']=get(i);//预处理[1~F]对应的二进制 
	a[0]=1,a[1]=2,a[2]=4;
	int T=read();while(T--){
		cin>>s;int len=strlen(s);
		string str=""; 
		for(int i=0;i<len;++i)str+=mp[s[i]];//拆为二进制 
		while(str.length()%3!=0)str="0"+str;//转化为3的倍数,方便计算8进制 
		string ans="";
		len=str.length();
		for(int i=0;i<len;i+=3)
			ans+=char((str[i]-'0')*a[2]+(str[i+1]-'0')*a[1]+str[i+2]);
		int pos=-1;
		for(int i=0;i<ans.length();++i)if(ans[i]!='0'){pos=i;break;}//找pos去前导0 
		if(pos==-1)cout<<0<<line;
		else cout<<ans.substr(pos)<<line;
	}
	return 0;
}
posted @ 2020-04-15 21:02  啥也不是*  阅读(176)  评论(0)    收藏  举报